有四种方法,实例方法,类方法,静态方法,属性方法
实例方法的第一个参数是self
,他会指向类的实例化对象,只能被对象调用,如
class Demo:
def instanceMethod(self):
print("this is a instance method")
if __name__ == "__main__":
demo = Demo()
demo.instanceMethod()
用点调用时不需要传入对象参数,python会把调用实例方法的对象作为实例方法的第一个参数传入,等价于
if __name__ == '__main__':
demo = Demo()
Demo.instanceMethod(demo)
使用装饰器@classmethod
。第一个参数必须是当前类对象,该参数名一般约定为“cls”,可以使用类(例如C.f())或实例(例如C()。f())调用类方法。 除了类之外,该实例被忽略。 如果为派生类调用类方法,则派生类对象将作为隐含的第一个参数传递。
class Demo:
@classmethod
def classMethod(self):
print("this is a class method")
if __name__ == "__main__":
demo = Demo()
Demo.classMethod()
demo.classMethod()
同样是语法糖,用点调用时会自动把调用类方法的类或对象作为第一个参数传入
用 @staticmethod 装饰的不带 self 参数的方法叫做静态方法,静态方法不会接收隐式的第一个参数,类似于c++中的静态方法,只是占用了类的命名空间,与类没有联系,了一使用类名或对象名调用
用来将一个方法变成静态属性,使用修饰器@property
class C:
def __init__(self):
self._x = None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
TODO : 有点难改天专门学
方法 | 修饰器 | 调用 | 使用场景(个人理解) |
---|---|---|---|
实例方法 | / | 只能被对象调用 | 大多数场景 |
类方法 | @classmethod | 能被对象或类调用 | 只操作类属性 |
静态方法 | @staticmethod | 能被对象或类调用 | 不操作类中的属性和方法 |
属性方法 | @property | 按静态属性的方法调用(不加括号) | TODO |
参考文章
GitHub 关于python的面试题
Python静态方法、类方法、属性方法
Python面向对象静态方法,类方法,属性方法
Python 实例方法、类方法、静态方法的区别与作用
python 文档 staticmethod
python 文档 classmethod