Python 类与对象 属性的魔法方法

文章目录

介绍

属性是类与对象的一大特征,对属性的访问,Python提供了一些魔法方法,它们在访问属性时自动调用

方法说明
__ getattr__(self,other)定义当用户试图获取一个不存在属性时的行为
__ getattribute__(self,other)定义当该类的属性被访问时的行为,返回一个属性
__ setattr__(self,name,value)定义一个属性被设置时的行为
__ delattr__(self,name)定义一个属性被删除时的行为
class OO():
    def __getattribute__(self,name):   #首先被访问
        print("getattribute")
        return super().__getattribute__(name)  #访问可以使用返回语句return,返回其所访问的值
    def __getattr__(self , name ):             #super().getattribute(name)只有一个参数,需要返回的是方法,不需传入对象
        print("getattr")
        #super().__getattr__(name)
    def __setattr__(self,name,value):
        print("setattr")
        super().__setattr__(name,value)
    def __delattr__(self,name):
        print("delattr")
        super().__delattr__(name)
>>> o = OO()
>>> o.x
getattribute
getattr
>>> o.x = 2
setattr
>>> del o.x
delattr
  • 可见其首先会调用getattribute函数,没有该属性时,会调用getattr函数,进行创建
  • 对于setattr(self,name,value) 即对对象的属性进行赋值,name是对象属性的名称object.name = value 当用户进行类似操作时,setattr函数自动被调用
class Rectangle():
    def __init__(self,hight = 0,width = 0):
        self.hight = hight
        self.width = width
    def __setattr__(self,name,value):  #name是调用的属性名称
        if name == "square":
            self.hight = value
            self.width = value
        else:
            self.name = value  #该方法会造成递归死循环,只要对属性进行赋值,就会
    def getArea(self):          #找setattr函数
        return self.hight * self.width

进行改进:

  1. 利用super()函数调用父类方法,无继承新类时,调用object父类方法
super().__setattr__(name,value)      #只是调用方法,不需要传入self实例化对象 
  1. 利用类与对象的字典属性dict __ dict__[key]属性是类与对象的特殊属性
  • 其作用是:以键值对的形式显示当前对象的所有属性,提供修改键值对的方法
self.__dict__[name] = value #self是实例化后的对象
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值