Skip to content

类型方法

前面的章节类型与实例中已经介绍了在类型中定义函数作为方法的概念。

方法的可访问性

类似于其他面向对象语言,Python中对象的方法和属性也可以声明其可访问性,例如是公有、私有还是保护,只不过这里的可访问性不是通过publicprivateprotected关键字定义的。

Python通过在方法或属性名前添加额外的下划线_来指定方法或属性的可访问性。

  • self.name是公有属性,self.getName()是公有方法;
  • self._name是私有属性,self._getName()是私有方法;
  • self.__name是保护属性,self.__getName()是保护方法;

根据约定俗成的编码规范,不应该从类的外部访问类或对象的私有和保护属性与方法。保护的程度比私有更高一级,在实际编程中的体现如下:

python
class User:
    def __init__(self):
        self.name = "MangoFanFan"
        self._uuid = "123456"
        self.__password = "999631"

user = User()
print(user.name)
print(user._uuid)
print(user.__password)

运行结果如下:

python
MangoFanFan
123456
Traceback (most recent call last):
  File "c:\Users\mango\Desktop\Code\cat.py", line 10, in <module>
    print(user.__password)
          ^^^^^^^^^^^^^^^
AttributeError: 'User' object has no attribute '__password'

user.name毫无疑问被成功获取;user._uuid虽然不建议,但也可以成功获取;user.__password无法被从外部直接获取。

公有方法、私有方法与保护方法间的差别同上。

你知道吗?

通过一些手段可以从类的外部强行访问到类的保护属性:

python
class User:
    def __init__(self):
        self.name = "MangoFanFan"
        self._uuid = "123456"
        self.__password = "999631"

user = User()
print(user.name)
print(user._uuid)
print(user.__password)  
print(user._User__password)  

这样就可以打印出user.__password的值999631了,但是这已经背离了保护的初衷,因此仅作了解。

魔术(Magic)不在此列

Python中存在一些预先定义或约定的特殊变量、属性、方法,它们的命名格式是__xxxx__,比如类型的初始化方法就是__init__()。这些变量、属性、方法即「魔术变量/魔术方法」不属于保护属性。

魔术方法

官方的称呼是特殊方法,但我们习惯称之为魔术方法/魔法方法。在类型中以__xxxx__命名的方法就是魔术方法,这些方法是Python预先定义或约定好的,不被视为保护方法。

Python类型的初始化方法/构造函数__init__()正是魔术方法,此外还有许多魔术方法,这些方法可以自定义类型的行为,也是Python面向对象工作的重要工具。

例如,__init__方法定制了一个类在实例化时需要进行的初始化操作,__del__方法定制了一个类在被释放时(可能是开发者使用del或Python进行垃圾回收时,更大可能性是Python运行结束时。)执行的操作。更多魔术方法会在后面介绍。

贡献者

页面历史