097 内置方法

目录

  • 一、__str__
  • 二、__setattr__,__delattr__,__getattr__(重要)
    • 实例
  • 三、__item__系列
  • 四、__call__

一、__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 内置方法)