1.实例方法、类方法、静态方法
# 实例方法(只能被实例调用)、类方法(类和实例都可以直接调用)、静态方法(类和实例都可以直接调用,不需要传递self或者cls)
class People(object):
# 实例方法
def exmaplesFun(self, name):
print('实例方法{},{}'.format(self,name))
# 类方法
@classmethod
def classFun(cls, name):
print('类方法{},{}'.format(cls,name))
#静态方法
@staticmethod
def staticFun(name):
print('静态方法{}'.format(name))
# 类可以直接调用 静态方法和类方法
People.classFun('cpx')
People.staticFun('zsf')
# People.exmaplesFun('2') # 报错 TypeError: exmaplesFun() missing 1 required positional argument: 'name'
# 类方法和实例方法也可以被实例对象调用
p = People()
p.exmaplesFun('gy')
p.staticFun('zsf')
p.classFun('cpx')
2.类方法的使用场景
# 类方法的使用场景:python不像java一个类有多个构造函数,python可以使用类方法实现多个构造函数的功能
class A(object):
def __init__(self, i):
self.i = i
@classmethod
def structure(cls,i,k):
a = cls(i)
a.k = k
return a
a = A(1)
a1 = A.structure(2,3)
print(a.i) # 输出结果 1
print(a1.i,a1.k) # 输出结果 2 3
# 类方法和静态方法都可以被子类重写
3.动态添加静态方法和类方法
class Male(object):
pass
# 动态添加静态方法
@staticmethod
def behavior():
print('动态添加静态方法')
Male.behavior = behavior
Male.behavior() # 调用behavior方法成功
# 动态添加类方法
@classmethod
def characteristic(cls):
print('动态添加类方法')
Male.characteristic = characteristic
Male.characteristic() # 调用characteristic成功
# 使用实例调用动态添加的方法
m = Male()
m.behavior() # 调用成功
m.characteristic() # 调用成功
4.多态
# 向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。
# 也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
class Ani(object):
def run(self):
pass
class Cat(object):
def run(self):
print('Cat 4条腿 run')
class Person(object):
def run(self):
print('Person 2条腿 run')
c = Cat()
c.run()
p = Person()
p.run()