Python类的实例方法、静态方法和类方法

Python类语法中支持三种方法:实例方法,静态方法,类方法。

class Foo(object):
    """类三种方法语法形式"""

    def instance_method(self):
        print("是类{}的实例方法,只能被实例对象调用".format(Foo))

    @staticmethod
    def static_method():
        print("是静态方法")

    @classmethod
    def class_method(cls):
        print("是类方法")

foo = Foo()
foo.instance_method()
foo.static_method()
foo.class_method()
print('----------------')
Foo.static_method()
Foo.class_method()
是类<class '__main__.Foo'>的实例方法,只能被实例对象调用
是静态方法
是类方法
----------------
是静态方法
是类方法

实例方法:只能被实例对象调用

静态方法(由@staticmethod装饰的方法):可以被类或类的实例对象调用

类方法(由@classmethod装饰的方法):可以被类或类的实例对象调用,用于模拟定义多个构造函数(Python类中只有一个初始化方法,不能按照不同情况初始化类)。

实例方法,第一个参数必须是实例对象self;静态方法,参数没有要求;类方法,第一个参数必须是类本身cls

  1. 模拟定义多个构造函数
import time

class Date(object):
    # 主构造函数
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day
        
    # 可选构造函数
    @classmethod
    def today(cls):
        t = time.localtime()
        return cls(t.tm_year, t.tm_mon, t.tm_mday)  # 调用主构造函数`__init__()`
a = Date(2012, 12, 21)
b = Date.today()
print(a.year, a.month, a.day)
print(b.year, b.month, b.day)
2012 12 21
2020 5 5
  1. 静态方法调用静态方法

当类中一个静态方法调用另一个静态方法,可以使用类方法(cls)代替,使代码精简,同时若类名被修改,无需在类定义中修改类名。

class Foo(object):
    X = 1
    Y = 2

    @staticmethod
    def averag(*mixes):
        return sum(mixes) / len(mixes)

    @staticmethod
    def static_method():
        return Foo.averag(Foo.X, Foo.Y)

    @classmethod
    def class_method(cls):
        return cls.averag(cls.X, cls.Y)

foo = Foo()
print(foo.static_method())
print(foo.class_method())
1.5
1.5
  1. 继承类中的区别

子类Son继承父类Foo,且Son覆盖了Foo的静态方法averag()

子类的实例p继承了父类的静态方法static_method(),调用static_method()是调用父类的方法Foo.averag()和类属性Foo.XFoo.Y

子类的实例p继承了父类的类方法class_method(),调用class_method()是调用子类的方法Son.averag()和子类的类属性Son.XSon.Y

class Foo(object):
    X = 1
    Y = 2

    @staticmethod
    def averag(*mixes):
        return sum(mixes) / len(mixes)

    @staticmethod
    def static_method():
        return Foo.averag(Foo.X, Foo.Y)

    @classmethod
    def class_method(cls):
        return cls.averag(cls.X, cls.Y)
        
class Son(Foo):
    X = 3
    Y = 5

    @staticmethod
    def averag(*mixes):
        return sum(mixes) / 3

p = Son()
print(p.static_method())
print(p.class_method())
1.5
2.6666666666666665

参考:

python类的静态方法和类方法区别

猜你喜欢

转载自blog.csdn.net/zhaoyin214/article/details/105937392