类属性可通过类访问:YourClass.clsattribute
或者通过实例(如果实例没有覆盖类属性):instance.clsattribute
如果通过实例访问方法,则实例作为self参数传递给描述符。
如果要从类中调用方法,则必须显式传递实例作为第一个参数。所以这些是等价的:instance.method()
MyClass.method(instance)
对实例属性和方法使用相同的名称将使该方法通过实例隐藏,但该方法仍然可以通过类使用:#python3
>>> class C:
... def __init__(self):
... self.a = 1
... def a(self):
... print('hello')
...
>>> C.a
>>> instance = C()
>>> instance.a
1
>>> C.a(instance)
hello
结论:实例属性和方法的名称不能相同。
我用有意义的名字来避免这个问题。方法是动作,所以我通常用动词或句子来表示。属性是数据,因此我对它们使用名词/形容词,这避免了对方法和属性使用相同的名称。
请注意,不能使用与方法同名的类属性,因为该方法将完全重写它(最后,方法只是可调用的类属性,并且会自动将类的实例作为第一个属性接收)。