python静态方法、实例方法、类方法的学习

#静态、类方法的学习
'''
本例创建了一个宠物Pet类,包含实例方法、类方法、静态方法,他们分别返回类属性(inst)和
实例,通过创建类实例,调用类内部的不同方法,学习类方法、静态方法
首先来学习类方法(可先看例子,再回来看本段):
get_pet_class(cls_obj)加了"类方法"@classmethod装饰器后,
括号内的参数cls_obj接收类对象
例中的实例是cat1,dog1,dog2都是Pet类创建,那么
@classmethod
def cat1.get_pet_class(cls_obj)
括号内传入的参数就是Pet类对象。
如果不加@classmethod,默认第一个参数就又变为接收实例对象啦。

def cat1.get_pet_class(cls_obj)
实际上括号内接收的是一个实例对象,尽管参数名写的是cls_obj。
那是不是必须写成self或cls_obj呢?
如果不怕混淆,也不怕其他码农抱怨,你可以取一个专属名称作为参数名。
写成cls_obj 或self 是python的规则。
'''

class Pet(object):
inst = 0  #用于创建实例计数,这叫类属性
def __init__(self):
#注意观察两者返回的值,self.inst是Pet类的实例对应创建的排位,下面dog2是第三个创建
#而Pet.inst是指Pet类创建了多少实例
self.inst = self.inst +1
Pet.inst = Pet.inst +1 
   

#Pet 类的方法,注意区分类方法,参数self接收实例对象,实例参数必须在括号内的第一位,写成self只是一种python的约定习惯

def get_pet_instance(self):
return '1类实例方法:',self.__class__,self.__class__.__name__,'第%s个实例'%self.inst


#加了类方法(@classmethod)后,实例对象会转成类对象,再传入cls_obj
@classmethod
def get_pet_class(cls_obj): 
return '2类方法:当前共计创建%s个实例'%cls_obj.inst

#可以尝试添加一个self参数,观察一下运行结果。会提示你没有传入参数。
@staticmethod
def get_pet_staticmethod():

return '3:','无参数的静态方法'


#参数a即便写成self或cls_obj,括号内也只是个普通的位置参数,只是本例a.inst
@staticmethod
def get_pet_sta_arg(a): 
return '4将实例作为参数传入:','第%s个实例'%a.inst

#在类的内部实现多态
@staticmethod
def class_pets(obj):
print('类内部多态实现:',obj.get_pet_class())

#在类的外部实现多态,简化其他人调用类方法,对“外人”的一种接口
def pets(obj):
print('类外部多态实现:',obj.get_pet_instance())


if __name__ == '__main__':
print('cat1','='*40)

cat1 = Pet() #cat1、dog1、dog2是实例对象
print(cat1.get_pet_instance()) #实例方法

#类的实例方法,通过类名+类的方法,括号内必须传入self,即实例名
print(Pet.get_pet_instance(cat1))

print(cat1.get_pet_class()) #类方法


print(cat1.get_pet_staticmethod()) #无参数的静态方法
print(cat1.get_pet_sta_arg(cat1)) #有参数的静态方法,这里传入一个实例对象
print('dog1','='*40)

dog1 = Pet()
print(dog1.get_pet_class())
#多态
pets(dog1)
dog1.class_pets(dog1)

print(dog1.get_pet_class())
print('dog2','='*40)

dog2 = Pet()
print(dog2.get_pet_instance())
print(dog2.get_pet_class())

#静态方法和普通方法没有区别,只不过静态方法建立在类的内部

print(dog2.get_pet_sta_arg(dog2)) 
print(Pet.get_pet_sta_arg(dog2))

print('\n')
#下面两者回显一样,因为get_pet_class()添加了@calssmethod类方法后,
#无论是cat1还是dog1.get_pet_class(),传入括号内的第一个参数都是类对象Pet

print(cat1.get_pet_class())
print(dog2.get_pet_class())
print(Pet.get_pet_class())
#以上三者返回一样





你可能感兴趣的:(python类)