python 实例方法,类方法,静态方法
目录实例方法
-
只能被被实例对象调用
-
第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法
-
方法内部可以传类的属性和方法
类方法
-
实例对象和类对象都可以调用。
-
使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”
-
通过它来传递类的属性和方法(不能传实例的属性和方法)
静态方法
-
实例对象和类对象都可以调用。
-
使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,
-
该方法体中不能使用类或实例的任何属性和方法
静态方法既不需要传入self参数,也不需要传入cls参数,这使得调用静态方法并不能获得类中定义的属性和其他方法。静态方法有点像附属于类对象的“工具”。
方法 | 特点 | 定义 | 调用 | 作用 |
---|---|---|---|---|
实例方法 | 第一个参数self | 实例所使用的方法,第一个参数必须是实例对象,该参数名一般使用self定义。通过它来传递实例的属性和方法 | 实例对象调用 | 此方法实现的功能作用于具体的对象(实例), |
类方法 | @classmethod | 定义的方法前需要加装饰器@classmethod .第一个参数必须是当前类对象,该参数名一般为cls 。通过它来传递类的属性和方法 。 | 类和实例调用 | 此方法实现的功能作用于类 |
静态方法 | @staticmethod | 定义的方法前需要加装饰器@staticmethod. 参数不受对象或类限制,方法体重也不能使用类或实例的任何属性和方法 | 类和实例调用 | 此方法现实的功能可以是针对类的一些规范,约束等,如针对学生行为规则,上课规则等 。 |
案例
class MyClass(object):
def instance_m(self, x):
print(f'executing instance_m({self}, {x})')
@classmethod
def class_m(cls, x):
print(f'executing class_m({cls}, {x})')
@staticmethod
def static_m(x):
print(f'executing static_m({x})')
mc = MyClass()
# 调用实例方法
print('-----------------------------------------')
mc.instance_m(666)
print(mc.instance_m)
print('-----------------------------------------')
# 调用类方法
mc.instance_m(666)
MyClass.class_m(666)
print(mc.class_m)
print('-----------------------------------------')
# 调用静态方法
mc.static_m(666)
MyClass.static_m('静态方法')
print(mc.static_m)
# 执行结果
-----------------------------------------
executing instance_m(<__main__.MyClass object at 0x00000200997046A0>, 666)
<bound method MyClass.instance_m of <__main__.MyClass object at 0x00000200997046A0>>
-----------------------------------------
executing instance_m(<__main__.MyClass object at 0x00000200997046A0>, 666)
executing class_m(<class '__main__.MyClass'>, 666)
<bound method MyClass.class_m of <class '__main__.MyClass'>>
-----------------------------------------
executing static_m(666)
executing static_m(静态方法)
<function MyClass.static_m at 0x000002009970B790>
class Person:
name = "xiaobeike"
age = 18
# 构造方法
def __init__(self, name, age):
self.name = name
self.age = age
print("__init__ >>>")
print(name,age)
def instance_func(self):
print("instance_func >>>")
print(self.name,self.age)
@classmethod
def class_func(cls):
print("class_func >>>")
print(cls.name,cls.age)
@staticmethod
def static_func():
print("static_func >>>")
print(Person.name,Person.age) # 可以,但不推荐
if __name__ == '__main__':
p = Person("dabeike", 21)
p.instance_func() # 实例方法 只能由 "对象" 调用
# Person.instance_method() # 报错
print('-' * 10)
p.class_func()
Person.class_func()
print('-' * 10)
p.static_func()
Person.static_func()
# 执行结果=======================================================
__init__ >>>
dabeike 21
instance_func >>>
dabeike 21
----------
class_func >>>
xiaobeike 18
class_func >>>
xiaobeike 18
----------
static_func >>>
xiaobeike 18
static_func >>>
xiaobeike 18