python类-属性


实例属性和类属性

理论基础

类属性有点类似C++中的静态变量,可以通过 【类名.属性 】直接访问

实例属性故名思议就是只有定义了类的实例后才可以用的属性


通过类名不可以访问实例属性

通过实例可以访问类属性


如果实例属性给类属性进行了赋值操作,则会将其覆盖。

代码示例

class SYG(object):

    class_var = 1
    
    def __init__(self):
        self.instance_var = 2

if __name__ == '__main__':
    syg = SYG()

    #可以通过实例来反访问类属性
    print(syg.class_var)

    print(SYG.class_var)

    #不可以用类名访问实例变量
    #print(SYG.instance_var)

    #实例属性会覆盖类属性
    syg.class_var = 3
   
    print(syg.class_var)
    print(SYG.class_var)


实例属性操作

重载object方法

如果我们要控制自己类中的实例属性,可以通过重载以下几个方法来实现特殊功能

★这些方法不能对类属性进行操作


__getattr__ 访问在类中未被定义的属性时会被调用

__setattr__ 设置所有的属性时被调用

__delattr__ 删除所有的属性时被调用

__getattribute__ 访问所有的属性时会被调用,这个被重载后。包含__getattr__

代码示例:

class SYG(object):
    def __init__(self):
        self.xx = 0

    def __getattr__(self,name):
        print("override getattr")
        return object.__getattr__(self,name)

    def __setattr__(self,name,value):
        print("override setattr")
        return object.__setattr__(self,name,value)

    def __delattr__(self,name):
        print('override delattr')
        return object.delattr(self,name)

    def __getattribute__(self,name):
        print('override getattribute')
        return object.__getattribute__(self,name)

if __name__ == '__main__':
    syg = SYG()
    syg.test = 3
    print(syg.test)
    print(syg.ok) #由于存在这个属性会抛出异常


输出结果:

override setattr
override getattribute
3
override getattribute
override getattr
Traceback (most recent call last):
  File "temp.py", line 27, in <module>
    print(syg.ok)
  File "temp.py", line 9, in __getattr__
    return object.__getattr__(self,name)
AttributeError: type object 'object' has no attribute '__getattr__'


使用property

一般函数实现
class SYG(object): 
    def __init__(self):
        self._x = 0

    def getx(self):
        print("getx")
        return self._x

    def setx(self,value):
        print('setx')
        self._x = value

    def delx(self):
        del self._x

    #定义自己的set,get,del操作
    newx = property(getx, setx, delx)
    
if __name__ == '__main__':
    syg = SYG()
    syg.newx = 3
    print(syg.newx)

用decorator方法实现

class SYG(object): 
    def __init__(self):
        self._x = 0

    @property
    def var_x(self):
        print('readonly _x')
        return self._x

    @var_x.setter
    def var_x(self,value):
        print('setx')
        self._x = value
        
    @var_x.deleter
    def var_x(self):
        del self._x

if __name__ == '__main__':
    syg = SYG()
    syg.var_x = 3
    print(syg.var_x)

《本节完》


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值