类属性方法

类的动态绑定属性

我们可以发现我们直接对王毅增加了属性,这就是动态绑定


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  #对象属性,




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青灯有味是儿时

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值