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
。
- 模拟定义多个构造函数
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
- 静态方法调用静态方法
当类中一个静态方法调用另一个静态方法,可以使用类方法(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
- 继承类中的区别
子类Son
继承父类Foo
,且Son
覆盖了Foo
的静态方法averag()
:
子类的实例p
继承了父类的静态方法static_method()
,调用static_method()
是调用父类的方法Foo.averag()
和类属性Foo.X
、Foo.Y
;
子类的实例p
继承了父类的类方法class_method()
,调用class_method()
是调用子类的方法Son.averag()
和子类的类属性Son.X
、Son.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
参考: