首页 > 其他 > 详细

097 内置方法

时间:2019-09-02 22:44:42      阅读:103      评论:0      收藏:0      [点我收藏+]

一、__str__

如果不重写__str__ 直接print打印对象时,会打印出内存地址

class Foo:
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return '['+self.name+']'
f=Foo('xc')
print(f)

二、__setattr__,__delattr__,__getattr__(重要)

点拦截方法

如果去对象中取属性,一旦取不到,会进入到__getattr__

如果去对象中赋值属性,一旦取不到,会进入到__setattr__

如果删除对象中的属性,会进入__delattr__

实例

class Foo:
    def __init__(self,name):
        self.name=name  # 会进入__setattr__(因此不会赋值)
    # 重写__getattr__
    def __getattr__(self, item):
        print('xxxx')
        return '你傻逼啊,没有这个字段'
    
    # 重写__setattr__
    def __setattr__(self, key, value):
        print('yyyyy')
        
    # 重写__delattr__
    def __delattr__(self, item):
        print('zzzzz')

f=Foo('xc')
print(f.name)   # 会进入__getattr__
print(f.age)    # 会进入__getattr__
print(f.__dict__) 
print(f.name)   # 会进入__getattr__
f.sex='male'    # 会进入__setattr__(因此不会赋值)
del f.name      # 会进入__delattr__
print(f.__dict__)

yyyyy
xxxx
你傻逼啊,没有这个字段
xxxx
你傻逼啊,没有这个字段
{}
xxxx
你傻逼啊,没有这个字段
yyyyy
zzzzz
{}

三、__item__系列

对象通过[] 中括号取值,赋值,删除值的时候,会调用

class Foo:
    def __init__(self, name):
        self.name = name
    def __getitem__(self, item):
        name=getattr(self,item)
        print(name)
        return name
    def __setitem__(self, key, value):
        print('obj[key]赋值时,执行我')
        self.__dict__[key] = value
    def __delitem__(self, key):
        print('del obj[key]时,执行我')
        self.__dict__.pop(key)
        
f=Foo('xc')
f["a"] = "123"

print(f['name'])

del f["a"]
print(f.__dict__)

obj[key]赋值时,执行我
{‘name‘: ‘xc‘, ‘a‘: ‘123‘}
xc
xc
del obj[key]时,执行我
{‘name‘: ‘xc‘}

四、__call__

对象加括号会调用它

class Foo:
    def __call__(self):
        print('xxxx')

f=Foo()
f()
print(f.__dict__)

xxxx

{}

097 内置方法

原文:https://www.cnblogs.com/XuChengNotes/p/11449016.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!