Python常见魔法方法

Python常见魔法方法

__new__

  • 创建实例
  • 在实例化过程中先调用__new__创建实例,再调用__init__初始化实例
  • __new__参数是类本身,返回的是创建的实例
class Py(object):
    def __new__(cls, *args, **kwargs):
        print 'new'
        new_object = super(Py, cls).__new__(cls, *args, **kwargs)
        print new_object
        return new_object

    def __init__(self, *args, **kwargs):
        print 'init'
        self.name = 'lisi'
        
test = Py()
print test.name
#====输出====
new
<__main__.Py object at 0x000000000396FAC8>
init
lisi

__init__

  • 实例初始化,给刚创建的实例增加属性,见__new__

__del__

  • 实例生命周期结束时调用,删除实例
class Py(object):
    def __new__(cls, *args, **kwargs):
        print 'new'
        return super(Py, cls).__new__(cls, *args, **kwargs)
    def __init__(self):
        print 'init'
        self.name = 'lisi'
    def __del__(self):
        print 'delete object'
        
test = Py()
#====输出====
new
<__main__.Py object at 0x000000000361FBA8>
init
delete object

__setattr__

  • 设置、修改实例属性时调用
class Py(object):
    def __init__(self):
        self.name = 'lisi'
        
    def __setattr__(self, key, value):
        print '属性名:{}, 属性值:{}'.format(key, value)
        super(Py, self).__setattr__(key, value)
test = Py()
test.name = 'zhangsan'
#====输出====
属性名:name, 属性值:lisi
属性名:name, 属性值:zhangsan

__getattribute__

  • 访问实例属性、方法时调用
  • item 为属性名或方法名
class Py(object):
    def __init__(self):
        self.name = 'lisi'
        
    def __getattribute__(self, item):
        print '__getattribute__'
        print item
        return super(Py, self).__getattribute__(item)
    
    def func(self):
        return 'func_str'
    
test = Py()
print test.name
print test.func()
#====输出====
__getattribute__
lisi
lisi
__getattribute__
func
func_str
  • 尽量不要重写,防止进入无限循环,如下:name != ‘a’,会访问self.age, 访问self.age属性会先访问__getattribute__,如此进入循环
class Py(object):
    def __init__(self):
        self.name = 'lisi'
        self.age = 12
        
    def __getattribute__(self, item):
        print '__getattribute__'
        if item == 'a':
            return super(Py, self).__getattribute__(item)
        else:
            return self.name
test = Py()
print self.name

__getattr__

  • 当访问不存在的属性、方法时先调用__getattribute__再调用__getattr
  • 抛出 AttributeError
class Py(object):        
    def __getattr__(self, item):
        return '__getattr__,属性or方法不存在'
    
    def __getattribute__(self, item):
        print '__getattribute__'
        return super(Py, self).__getattribute__(item)
    
test = Py()
print test.age
#====输出====
__getattribute__
__getattr__,属性or方法不存在

__delattr__

  • 删除一个实例对象的属性时调用
class Py(object):
    def __init__(self):
        self.name = 'lisi'

    def __delattr__(self, item):
        print '__delattr__', item
        return super(Py, self).__delattr__(item)
    
test = Py()
del test.name
#====输出====
__delattr__ name

__str__

  • print 对象时返回的值
class Py(object):
    def __init__(self):
        self.name = 'lisi'

    def __str__(self):
        return '__str__'
    
test = Py()
print test
#====输出====
__str__

__call__

  • 对象被当做方法调用时调用的方法
class Py(object):
    def __init__(self):
        self.name = 'lisi'

    def __call__(self, *args, **kwargs):
        return '__call__'
    
test = Py()
print test()
#====输出====
__call__

__dict__

  • 打印对象所有属性和值
class Py(object):
    def __init__(self):
        self.name = 'lisi'
        self.age = 12
print(Py().__dict__)

#====输出====
{'name': 'lisi', 'age': 12}

setattr(), getattr(), hasattr()函数

object 类或对象
当 object 为对象时:
setattr == __setattr__, 
getattr == __getattr__,
delattr == __delattr__,


# 设置、重置对象属性值
setattr(object, name, value)  

# 获取属性或方法,返回属性值/方法地址
getattr(object, 'func/attr')

# 判断是否存在类或方法,返回 True/False
hasattr(object, 'func/attr') 

# 删除方法,属性
delattr(object, 'func/attr') 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值