094 内置方法

一、内置方法

  1. __init__ 在对象实例化的时候自动调用的

  2. __str_:如果不重写__str_ print打印会打印出内存地址,如果重写了,会打印出你想要的
  3. __repr__ 跟str类似,在交互式命令下直接写变量名,会执行__repr__

  • __str__

    1.不写__str__
    class Foo:
        def __init__(self,name):
            self.name=name
        # def __str__(self):
        #     return '['+self.name+']'
    
    f=Foo('nick')
    print(f.__str__())

    <main.Foo object at 0x00000201444E77F0>

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

    [xichen]

    l=[1,2,3]
    # #本质也是调用list的__str__方法
    print(l)

    [1, 2, 3]

1.__setattr__

  • 添加/修改属性会触发它的执行
  • 如果去对象中赋值属性,一旦取不到,会进入到__setattr__
class Foo:
    def __init__(self,name):
        self.name=name
        
    def __setattr__(self, key, value):
        print('对象没有这个属性')
1.原来字典使用方式dict
dic = dict(name='xichen',age=18)
print(dic)
print(dic ['name'])

{'name': 'xichen', 'age': 18}
xichen

2.写一个类继承字典,让它可以 .取值,可以中括号取值
class Mydict(dict): # 继承dic这个类
    def __init__(self,**kwargs):
       
        super().__init__(**kwargs)

    def __getattr__(self, item):
      
        print(item)

        return self[item]
    def __setattr__(self, key, value):
        self[key]=value

        
        
di=Mydict(name='xichen',age=18)
print(di['name'])
print(di.name)
di.sex='male'
di['sex']='male'

di.age=18
print(di.age)

xichen
xichen

18

2.__getattr__

  • 只有在使用点调用属性且属性不存在的时候才会触发
  • 如果去对象中取属性,一旦取不到,会进入到__getattr__
class Foo:
    def __init__(self,name):
        self.name=name
    def __getattr__(self, item):
        return '没有这个字段'
    
f = Foo('xichen')
print(f.age)

没有这个字段

3.__delattr__

  • 删除属性的时候会触发
  • 如果删除对象中的属性,会进入__delattr__
class Foo:
    def __init__(self,name):
        self.name=name
        
    def __delattr__(self,item):
        self.__dict__.pop(item)
        print('删除成功')
        
        
del f.name
print(f.__dict__)

删除成功
{'age': 18}

4.__item__系列

  • 对象通过[] 中括号取值,赋值,删除值的时候,会调用
class Foo:
    def __init__(self, name):
        self.name = name
    def __getitem__(self, item):
        name=getattr(self,item)
        # print(name)
        # print(self.__dict__[item])
        return name
        # return self.__dict__[item]
    def __setitem__(self, key, value):
        print('obj[key]=lqz赋值时,执行我')
        self.__dict__[key] = value
    def __delitem__(self, key):
        print('del obj[key]时,执行我')
        self.__dict__.pop(key)
f=Foo('xichen')
print(f['name'])

xichen

  • __setitem__
f['age'] = 18
print(f['age'])
print(f.__dict__)

obj[key]=lqz赋值时,执行我
18
{'name': 'xichen', 'age': 18}

  • __delitem__
del f['age']
print(f.__dict__)

del obj[key]时,执行我
{'name': 'xichen'}

5.__call__:对象加括号会调用它

class Foo:
    def __call__(self):
        print('调用我 !')

f=Foo()
f()

调用我 !

6.__enter__和__exit__

  • 本质是,上下文管理器
  • 就是我们用with open 打开文件的时候,是触发了__enter__,帮我们打开文件
  • 当系统检测到我们是顶格写的时候实际上就是触发了__exit__,所以帮我们自动释放了资源
with open('path','r') as f:
    pass

猜你喜欢

转载自www.cnblogs.com/xichenHome/p/11448722.html