类的动态绑定属性
我们可以发现我们直接对王毅增加了属性,这就是动态绑定
class 王毅:
pass
wangyi=王毅()
wangyi.tall=2.92 #动态增加属性,仅仅适用于当前对象
wangyi.love=lambda :print("喜欢泡妞") #属性,类方法包含self
print(wangyi.tall)
wangyi.love()
xiaowangyi=王毅()
#print(xiaowangyi.tall)
#xiaowangyi.love()
动态绑定类的方法
我们可以看到女神的备胎数从99变成0,我们使用types里的一个方法MethodType将方法绑定一个对象,使得对象获得这个方法,别人想用是用不了的。
import types #类型的模块
class 周资源:
pass
def 彩票中奖(self):
print("被调用")
self.女神的备胎数量=0
xiaozhou= 周资源()
xiaozhou.女神的备胎数量=99
print(xiaozhou.女神的备胎数量)
xiaozhou.中奖=types.MethodType(彩票中奖,xiaozhou)#绑定方法给一个对象
xiaozhou.中奖() #动态增加属性,仅仅适用于当前对象
print(xiaozhou.女神的备胎数量)
dazhou=周资源()
dazhou.中奖()
#动态增加方法只适用于当前对象
self
self就是给一个参数,无论是xiaoyu还是dayu调用于前鹏都可以使用,但是可以发现各自有着不同的地址
class 于前鹏:
def __init__(self):
print(id(self),"self id")#查看self的地址
xiaoyu=于前鹏()
print(id(xiaoyu),"xiaoyu id") #self抽象概念,
dayu=于前鹏()
print(id(dayu),"dayu id")
类的动态操作
对于第一个lovestr我们可以发现使用hasattr去判断有没有这个lovestr属性,之后我们可以使用setattr设置一个新的lovestr属性,通过getattr读取lovestr这个对象属性,如果我们getattr读取不到那么就会返回到默认值,比如我们写入的凤姐,如果使用setattr创建了一个没有的属性,那么我们就创建一个新的属性比如age,“100”
class 胡自强:
def __init__(self):
self.lovestr="""妞的存在就是被泡,
你不泡自有人取你而代之,
如果反正是被泡,不如被我泡"""
xiaohu=胡自强()
print(xiaohu.lovestr)
print(hasattr(xiaohu,"lovestr"))#判断xiaohu有没有lovestr这个属性
setattr(xiaohu,"lovestr","有妞不泡,天理不容")#设置xiaohu的lovestr这个属性,
print(xiaohu.lovestr)
print(getattr(xiaohu,"lovestr"))#读取xiaohu这个对象属性
print(getattr(xiaohu,"lovegirl","凤姐"))#获取属性,存在就返回属性,不存在返回默认值
#print(setattr(xiaohu,"age",100)) #没有这个属性,就创造一个,有这个属性覆盖
#print(xiaohu.age)
类的方法动态操作
但我们发现我们使用setattr绑定一个方法比如lovedo,这是不行的,我们要想之前一样调用types
的MethodType方法去给xiaohu增加一个方法
import types
class 胡自强:
def __init__(self):
self.lovestr="""妞的存在就是被泡,
你不泡自有人取你而代之,
如果反正是被泡,不如被我泡"""
def lovedo(self):
print("喜欢凤姐")
def lovedo(self):
print("喜欢上了凤姐")
xiaohu=胡自强()
xiaohu.lovedo()
print(dir(xiaohu))
print(hasattr(xiaohu,"lovedo"))#方法存在
print(getattr(xiaohu,"lovedo"))#抓取到了方法
#print(setattr(xiaohu,"lovedo",lovedo)) #setattr无法绑定方法,“”self,“”
#绑定用xiaozhou.中奖=types.MethodType(彩票中奖,xiaozhou)#绑定方法给一个对象
xiaohu.lovedo=types.MethodType(lovedo,xiaohu) #动态方法
xiaohu.lovedo()
对象属性方法与类属性方法
我自己的理解是初始化参数的是类属性,但我们自己动态创建的是一个对象属性。
#动态解释
#num=1 #新建一个变量,存储常量1的地址
#num=1
#num=2 #新建一个变量,存储常量1的地址,再存储为常量2的地址
class 梁华锋:
def __init__(self):
self.name="小梁" #类属性
xiaoliang=梁华锋()
xiaoliang.name="daliang" #类属性
xiaoliang.备胎数量=10 #对象属性,