(p1, 'sex', 'male')# 若属性或方法不存在,而getattr提供了默认值,则返回默认值 'male' setattr(object, key, value):给对象object的属性key..., name)方法,当发现属性x不存在于对象的__dict__中时,就调用了__getattr__,即属性拦截。 ...delattr >>> del b.z # 删除不存在的属性,也调用__delattr__ You are using delattr 我们注意到上面的代码中,返回属性内容用的是return...当新增属性并赋值后,属性就存在于__dict__中了,再调用时,依然会被拦截,但由于存在于__dict__中了,会将结果返回。以上黑魔法中的参数name就对应于对象或类中的属性。 ...同样的,对象通过键的方式操作属性时,也会触发上面的三种方法。需要注意的是,字符串和元组只能取出其元素,不等删除和修改元素,所以字符串和元组中只有__getitem__方法。
dir函数不会列出 __dict__ 属性本身,但会列出其中的键。dir函数也不会列出类的几个特殊属性,例如 __mro__、__bases__ 和 __name__。...二、getattr(object, name[, default]) 获取对象object的属性或者方法,如果存在则打印出来,如果不存在,打印默认值,默认值可选。...接着使用上面定义的类,我们可以获取Women对象已有的属性和方法,如果获取没有的属性和方法,会报错。 如果是对象没有的属性,我们可以设置默认值,则getattr会返回这个默认值。...如果object对象中存在指定的属性,或者能以某种方式(例如继承)获取指定的属性,返回True。...也就是我们在本地定义的类的属性,如果通过setattr给对象添加属性,则vars中也会有添加的属性,返回的结果是属性名和属性值构成的字典。 ?
=None) 2 #获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印默认值,默认值可选。...12 # print(getattr(t,'age'))#获取一个不存在的属性,----报错 13 print(getattr(t,'age','15'))#若属性不存在,返回一个默认值 setattr...__dict__.pop(item) #__setattr__添加/修改属性会触发它的执行 f1=Foo(10) print(f1....__dict__) #__delattr__删除属性的时候会触发 f1.__dict__['a']=3#我们可以直接修改属性字典,来完成添加/修改属性的操作 del f1.a print(f1....__dict__) #__getattr__只有在使用点,调用属性且不存在的时候才会触发 f1.xxxxxxx
当属性name可以通过正常机制追溯到时,__getattr__是不会被调用的。如果在__getattr__(self, attr)存在通过self.attr访问属性,会出现无限递归错误。...如下所示,ClassA中定义了__getattribute__方法,实例insA获取属性时,都会调用__getattribute__返回结果,即使是访问__dict__属性。...如果类自定义了__setattr__方法,当通过实例获取属性尝试赋值时,就会调用__setattr__。常规的对实例属性赋值,被赋值的属性和值会存入实例属性字典__dict__中。...类定义中的self.attr也同样,所以在__setattr__下还有self.attr的赋值操作就会出现无线递归的调用__setattr__的情况。...__dict__) # 由于调用的'__setattr__', name属性没有加入实例属性字典中。
标准名称包括: 如果存在编码错误,’strict’ 会引发 ValueError 异常。 默认值 None 具有相同的效果。 ‘ignore’ 忽略错误。请注意,忽略编码错误可能会导致数据丢失。...请注意即使在传递给 exec() 函数的代码的上下文中,return 和 yield 语句也不能在函数定义之外使用。该函数返回值是 None 。...如果对象不提供 dir(),这个函数会尝试从对象已定义的 dict 属性和类型对象收集信息。结果列表并不总是完整的,如果对象有自定义 getattr(),那结果可能不准确。...hash(object) 返回该对象的哈希值(如果它有的话)。哈希值是整数。它们在字典查找元素时用来快速比较字典的键。相同大小的数字变量有相同的哈希值(即使它们类型不同,如 1 和 1.0)。...vars([object]) 返回具有dict属性的模块,类,实例或任何其他对象的dict属性。
类的内置函数(继承object的,自己重写) 内置函数 执行时机 注意点 调用案例 __init__ 实例化对象时 不允许写返回值(return None和不返回没区别)子类重写了__init__()方法要在子类中的...__dict__ 返回调用者自身的名称空间 stu....__dict__ __class__ 返回当前调用对象的类 __slots__ 指定该类对象能所能拥有的全部属性,减少内存开销 会将类对象的属性给限制死,视情况使用,连__dict__都会被省掉 _...__class__ 面向对象相关内置方法(python解释器内置方法) 函数 作用 注意点 案例 hasattr() 判断某个对象是否存在某个属性 返回值是True / False hasattr(p..., 'age') getattr() 从对象中取出值 第三个位置默认值,不存在时返回默认值 getattr(p, 'age', None) setattr() 为对象添加、修改属性 setattr(p
,对于不存在的键,会赋一个默认值。...' 时,空列表 [] 作为默认值赋给其键对应的值。...inventory['Monopoly'] 20 如果多个字典都有某个键,那么返回第一个含该键的字典的值。...用 get() 函数查看超级玛丽,'Super Mario',如果每个字典都没此键,不返回值也不报错。...有一个 reversed() 函数,可以逆序返回字典的键。
tuple的功能.png Counter Counter是一个dict子类,可帮助计算可哈希对象的值。在其中,元素存储为字典的键,值可以为零或负值。...,即使defaultdict对象中没有键,您也可以看到它会自动创建一个空列表。...list.append然后有助于将值附加到列表中。 使用dict时,如果引用的Key不存在,就会抛出KeyError。...如果希望key不存在时,返回一个默认值,就可以用defaultdict: >>> from collections import defaultdict >>> dd = defaultdict(lambda...: 'N/A') >>> dd['key1'] = 'abc' >>> dd['key1'] # key1存在 'abc' >>> dd['key2'] # key2不存在,返回默认值 'N/A' nametuple
D.pop(key, [D]) # 删除字典中键值为key的项,返回键值为key的值,如果不存在,返回默认值D,否则异常...# 字典注意事项:(1)对新索引赋值会添加一项(2)字典键不一定非得是字符串,也可以为任何的不可变对象 #-- 字典解析 D = {k:8 for k in ['s'...__dict__ # {'pay':0, 'name':'bob', 'job':'Manager'} #-- 返回1中 数据属性spam是属于类 而不是对象...0) # 获取属性或方法 如果属性不存在 则返回默认值0 #这里有个小技巧,setattr可以设置一个不能访问到的属性,即只能用getattr获取...# s中age属性不存在 故调用__getattr__方法 返回25 # (5)__call__方法: 定制类的'可调用'性 class Student(object):
,需通过类提供的接口进行访问 双下划线开头 私有成员,只有类对象自己能访问,连子类对象也不能访问到这个数据 前后双下划线 python里特殊方法专用的标识,也称为保留属性、魔法函数 保留属性、方法...__dict__ 类型字典,存储所有类型成员信息 class.__class__ 类型 class.__bases__ 返回类的直接父类(实例没有该属性) class....__slots__() 只定义特定集合的某些属性,使用之后类变成静态一样,没有了__dict__, 实例也不可新添加属性 类相关魔法函数 目的 所编写代码 Python 实际调用 初始化一个实例...__getattr__('color');而只会返回x.color 已定义好的值。 无论何时给属性赋值,都会调用 __setattr__() 方法。...__delitem__(key) 为缺失键提供默认值 x[nonexistent_key] x.__missing__(nonexistent_key) 切片 x[i:j] x.
一、魔术方法 概念 在python中,所有以__xxx__格式的方法统称为“魔术方法” 方法 初始化 __new__ __init__ __del__ 属性控制 __getattr...当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法 __setattr__ 会拦截所有属性的的赋值语句。...这个需要注意,当在__setattr__方法内对属性进行赋值时,不可使用self.attr = value,因为他会再次调用self....He is %d years old"%(self.name, self.age) # 使用点语法访问不存在的属性时被自动调用 # 作用:调用某些不存在的属性时不想报错,想返回一个默认值...def __getattr__(self, item): print("__getattr__") return "%s属性不存在"%item # 当调用点语法设置属性值时被自动调用
例如,getattr(x, 'foobar') 等同于 x.foobar。如果指定的属性不存在,则返回默认值(如果提供),否则引发 AttributeError。...它们用于在字典查找期间快速比较字典键。比较相等的数值具有相同的散列值(即使它们具有不同的类型,就像 1 和 1.0 一样)。...sep 和 end 都必须是字符串;它们也可以是 None,这意味着使用默认值。如果没有给出对象,print() 将只写入 end。...key 指定一个带有一个参数的函数,用于从每个列表元素中提取比较键:key=str.lower。默认值是 None(直接比较元素)。 reverse 是一个布尔值。...name 字符串是类名,并成为 __name__ 属性;bases 元组逐项列出基类,并成为 __bases__ 属性;dict 是包含类体的定义的命名空间,并被复制到标准字典中以变为 __dict__
实现__getattr__的用户定义类可以实现我称之为虚拟属性的动态属性变体:这些属性在类的源代码中没有明确声明,也不在实例__dict__中存在,但可能在用户尝试读取不存在的属性时在其他地方检索或在需要时动态计算...类中存在属性会影响实例中属性的查找方式,这可能一开始会让人感到惊讶。下一节将解释。 属性覆盖实例属性 属性始终是类属性,但实际上管理类的实例中的属性访问。...dir本身不列出__dict__属性,但列出__dict__键。类的几个特殊属性,如__mro__、__bases__和__name__,也不被dir列出。...主要用例是检索我们事先不知道的属性(或方法)。这可能会从对象的类或超类中获取属性。如果没有这样的属性存在,则getattr会引发AttributeError或返回default值(如果给定)。...__dict__。 ⑦ 验证该值是否在obj.__dict__中,位于over键下。 ⑧ 然而,即使有一个名为over的实例属性,Managed.over描述符仍然会覆盖尝试读取obj.over。
AttributeError:当你用点号操作(.)访问一个对象不存在的属性或方法时,Python 会抛出此异常。 合并起来,错误信息提示:你访问或调用了一个值为 None 的变量的属性或方法。...函数未返回值(返回 None) Python 中没有显式 return 或 return 后无表达式,默认返回 None: def load_config(path): with open(path...if obj is None 或使用默认值。...优雅的默认值与 getattr、dict.get dict.get 带默认值 length = data.get('items', [])....__len__() getattr 带默认属性 text = getattr(tag, 'text', '') 3.
2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。...四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) 1、getattr(object, name[,default]) 获取对象object的属性或者方法,如果存在打印出来...,如果不存在,打印出默认值,默认值可选。...,和setattr函数作用相反,当属性不存在的时候,会报错,不能删除对象的方法。...__str__方法,如果str方法有,那么他返回的必定是一个字符串 # 如果没有__str__方法,会先找本类中的__repr__方法,再没有再找父类中的__str__。
python中的一切事物都是对象(都可以使用反射) 注:getattr,hasattr,setattr,delattr对模块的修改都在内存中进行,并不会影响文件中真实内容。...__dict__['name']) #egon # 常用 # hasattr 判断对象是否存在某属性或方法 # getattr 如果存在这个方法或者属性,就返回属性值或者方法的内存地址;如果不存在...hasattr(egg,'func'): #返回bool Foo_func=getattr(egg,'func') #如果存在这个方法或者属性,就返回属性值或者方法的内存地址...__str__没有被实现的时候,就会调用__repr__方法(即__str__和__repr__同时存在时,会执行str,不会执行repr) 但是当你用字符串格式化的时候 %s和%r会分别去调用__str..._是不会被调用的,即使是父类的实例也不行: class A(object): pass class B(A): def __init__(self): print('init
按照约定, __repr__() 方法所返回的字符串为合法的 Python 表达式。 在调用 print(x) 的同时也调用了 __str__() 方法。...__getattr__('color');而只会返回x.color 已定义好的值。 无论何时给属性赋值,都会调用 __setattr__() 方法。...通常,调用 dir(x) 将只显示正常的属性和方法。如果__getattr()__方法动态处理color 属性, dir(x) 将不会将 color 列为可用属性。...__delitem__(key) 为缺失键提供默认值 x[nonexistent_key] x....__rmul__(y) == y*x __reduce__, __reduce_ex__ , for pickle __slots__ 使用之后类变成静态一样,没有了__dict__, 实例也不可新添加属性
This is done by calling getattr(obj, name) and catching AttributeError. """ pass 通过源码注释我们知道,它返回对象是否具有指定名称的属性...就像上面的属性调用,我们就可以使用hasattr(a, "test")来判断,通过源码注释我们也可以思考一下,eval这种是不是也可以实现这种方法呢?...getattr() 有了判断属性是否存在的函数,那么就得有获取属性的函数了. def getattr(object, name, default=None): # known special case...,想到与object.name,如果提供了default参数,那么当属性不存在的时候,就会返回默认值。...从例子中我们可以看出,hasattr并没有调用test函数,而且getattr获取到的是函数对象,也没有调用它,通过我们主动执行func()才执行了a.test()函数,这样相比于exec和eval就灵活了许多
_ 返回一个字典,字典内容是当前对象的属性(不包括父类),属性名作为键,属性值作为键对应的值 A....__dict__ # {'name': 'def', 'age': 20} 从这两个方法的对比,我们也可以看出来,__dict__ 得到的内容只是 dir() 的子集,dir() 中包含 __dict_..._ 中的属性 __getattr__ 与 __getattribute__ https://www.cnblogs.com/huchong/p/9306459.html https://juejin.cn.../events/all 二者都是访问属性的方法,不同的是所有通过实例访问属性都会触发 __getattribute__ 方法,而当访问的属性不存在时,会继续触发 __getattr__,也就是说 __getattribute...__dict__ 调用方法也很简单 __builtin__.str(1) python3 在 python3 中,内建模块用 builtins 表示,同样也要先引入才能查看,各种查看方法与调用方法与 python2
,属性值不为空,直接返回属性值。...在说LazySetting对象之前,我们先看一下python的类属性的查找方式: 在查找一个实例化的类属性的时候 首先查找这个类的实例属性是否存在,存在直接返回 如果类的实例属性中不存在,则在类的类属性中查找...,类属性中存在,则返回 如果类属性中也不存在,若定义了__getattr__方法,则根据__getattr__方法获取属性 在python中类属性和实例属性会记录在类的一个内置变量__dict__中,类属性和实例属性有各自维护的...__dict__)中查找,没有找到话,通过__getattr__方式获取,获取到后,将属性值保存到实例属性中,这样就实现了属性在使用的时候 再获取,然后保存。...,这样的话,类的初始化就计算属性的值方式会浪费大量的计算机资源;使用延迟加载的方式,就可以很好的解决这种问题,到使用属性值的时候再获取。