19.实例方法,类方法,静态方法

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

参考资料

参考资料1

参考资料2

posted @ 2023-07-17 11:34  贝壳里的星海  阅读(14)  评论(0编辑  收藏  举报