面向对象——类的内置attr(三十三)

class Foo:
    x=1
    def __init__(self,y):
        self.y=y

    def __getattr__(self, item):
        print(‘----> from getattr:你找的属性不存在‘)

    def __setattr__(self, key, value):
        print(‘----> from setattr‘)
        # self.key=value #这就无限递归了,你好好想想
        # self.__dict__[key]=value #应该使用它

    def __delattr__(self, item):
        print(‘----> from delattr‘)
        # del self.item #无限递归了
        self.__dict__.pop(item)

#__setattr__添加/修改属性会触发它的执行
f1=Foo(10)
print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
f1.z=3
print(f1.__dict__)

#__delattr__删除属性的时候会触发
f1.__dict__[‘a‘]=3#我们可以直接修改属性字典,来完成添加/修改属性的操作
del f1.a
print(f1.__dict__)

#__getattr__只有在使用点调用属性且属性不存在的时候才会触发
f1.xxxxxx

三者的用法演示
class Foo:
    def __init__(self,x):
        self.x = x

    def __getattr__(self, item):
        print("执行__getattr__")

    def __delattr__(self, item):
        print("执行 __delattr__")
        self.__dict__.pop(item)
    def __setattr__(self, key, value):
        print("执行__setattr__")
        self.__dict__[key] = value

f1 = Foo(10) # 执行__setattr__
print(f1.x) # 10
f1.dfhsjdsfh # 执行__getattr__ 调用f1 中不存在的属性是会触发

print(f1.__dict__) # {‘x‘: 10}
f1.y = 3 # 执行__setattr__
print(f1.__dict__) # {‘y‘: 3, ‘x‘: 10}

f1.__dict__[‘z‘] = 5
print(f1.__dict__) # {‘x‘: 10, ‘y‘: 3, ‘z‘: 5}
del f1.z # 执行 __delattr__
print(f1.__dict__) # {‘x‘: 10, ‘y‘: 3}

原文地址:https://www.cnblogs.com/xiangtingshen/p/10461845.html

时间: 2024-10-11 04:04:14

面向对象——类的内置attr(三十三)的相关文章

Python随心记--类的内置attr属性

class Foo: x = 1 def __init__(self,y): self.y = y def __getattr__(self, item): #如果对象不存在的属性是会触发 print('执行了__gerattr__') def __delattr__(self, item): #删除的时候会触发 print('执行了__delattr__') self.__dict__.pop(item) def __setattr__(self, key, value): #设置属性是会触发

面向对象:类的内置方法

__str__和__repr__:实例化一个对象,该对象的返回值是一个指向这个类的内存地址 class A: pass a = A() print(a) #打印: <__main__.A object at 0x000001FA526DA108> 自定义__str__和__repr__方法: class Func: pass def __str__(self): return '我是自定义的str' def __repr__(self): return '我是自定义的repr' a = Fun

爱根,征服我的一天[isinstance,issubclass]、反射、内置attr,定制自己的数据类型

今日重点: 111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 isinstance,issubclass # isinstance(obj,cls)检查是否obj是否是类 cls 的对象. # issubclass(sub,super)检查sub类是否是 super 类的派生类. class Peop

Python进阶-----类的内置item属性方法

类的内置item相关方法只有在通过字典key操作才会触发而通过点的方式来操作,则触发attr相关方法 class Foo: def __init__(self,name,age): self.name = name self.age = age def __getitem__(self, item): print('执行getitem') return self.__dict__[item] def __setitem__(self, key, value): print('执行setitem'

类的属性、类的方法、类的内置方法

类的属性 变量在类中称为类的属性,函数在类中称为类的方法,类的属性分为以下几种: (1) 公有属性:在类中和类外都能调用的属性,定义的时候与变量的定义一致,如 color = 'yellow'(2) 私有属性:不能在类外及被类以外的函数调用,定义的时候以双下划线开头,如__color = 'yellow' (3) 内置属性: 由系统在定义类的时候默认添加的,定义的时候以前后双下划线构成,如 dict #!/usr/bin/env python class People(object): colo

铁乐学python_day24_面向对象进阶1_内置方法

题外话1: 学习方法[wwwh] what where why how 是什么,用在哪里,为什么,怎么用 学习到一个新知识点的时候,多问问上面的四个问题,并了解和实践透彻. 什么是反射? 先不说枯燥的概念,你可以自己总结出来,对于python中的反射,什么时候会用到? 需要使用字符串数据类型的变量名来使用变量的时候用到反射. (通过字符串的形式操作对象相关的属性和方法.) 关键词:字符串 使用到字符串的场景多在: 1)文件中存储的是字符串, 2)网络上能传递的也最接近字符串, 3)用户输入的(用

几个类的内置方法

# 类的内置方法 # 双下方法 # __str__ # 当类中定义了__str__方法后,print(这个类对象时),会调用__str__. 或者格式化%s输出对象时,都会触发__str__ # __repr__ # 当类中定义了__repr__方法后,print(repr(a)),就会调用a对象中的__repr__()方法.格式化输出用%r时同样会调用__repr__ # 同样对象中如果没有定义__repr__方法,那么就会调用父类中的__repr__ # __repr__是__str__的备

类的内置方法(魔法方法)

''' 类的内置方法(魔方方法): 凡是在类内部定义的,__开头__结尾的方法,都是类的内置方法,也称为魔法方法 类的内置方法,会在某种条件满足下自动触发. __new__:在__init__触发前,自动触发.调用该类时,内部会通过__new__来产生一个新的对象. __init_:在调用类时自动触发.通过__new__产生的对象自动调用__init__. ''' class Demo(object): def __new__(cls, *args, **kwargs): print('from

Python之面向对象:类的内置方法

1.def __add__(self,other): c1+c2 两个实例的加法操作就是执行__add__()方法 2.__str__(self): print一个实例的时候,执行的是__str__()这个内置方法 eg: class Vector(object): def __init__(self,a,b): self.a = a self.b = b def __str__(self): return 'Vector(%d,%d)'%(self.a,self.b) def __add__(