首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

python魔术方法之装饰器

__init__ at 0x0000000000DDAAE8>, '__dict__': } 看到没有dict内容 照常来讲会修改...dict,但是触发了set描述器,也就self.x = 这条语句没有被加入到dict 总结: set如果对实例化中的属性定义,则对属性做修改 说到底就是如果实例的字典里没有,则去类的dict中去查找,set...是对类的dict进行修改 通过这样的方式绕开了字典搜索 官方解释:有set,实例的优先级最高,如果没有set则类的优先级比较高 总结: get: class A:     def __init__(self...__': } 一句话总结:一旦使用set,只能操作类属性 下面例子中,虽然会触发set,但是什么都没有操作 b = B() b.xxx...__dict__) 调用返回None,因为没有A的实例 a = A.foo print(a) None 相当于在定义foo的时候被传递给StaticMethod(foo) 当前的foo相当于一个实例对象

62210

Python中反射

__dir__()))  上例通过属性字典__dict__来访问对象的属性,本质上就是利用反射的能力,但是上面的例子中,访问的方式不优雅,Python提供了内置的函数  内建函数意义getattr(object...,name[,default])通过name返回object属性值,当属性不存在,将属性不存在,将使用default返回,如果没有default,则抛出AttributeError,name必须是字符串...setattr(object,name,value)object属性,则覆盖,不存在则新增hasaattr(object,name)判断对象是否有这个名字的属性,name必须为字符串 class Point...,如果找不到,就会执行__getattr__()方法,如果没有这个方法,就会抛出AttributeError异常标识找不到属性 查找属性顺序为: instance__dict__---->instance.class.dict...异常  它的return值将作为属性查找的结果如果抛出AttributeError异常,则会直接调用__getattr__方法,因为属性没有找到 __getattribute__方法中为了避免在该方法中无线递归

85000

python 动态属性和特性

_h @width.setter # 可以设置属性值,没有该方法是只读属性 def width(self, v): self....有 __dict__ 属性的对象, 任何时候都能随意设置新属性 如果类有 __slots__ 属性,它的实例可能没有 __dict__ 属性 __slots__ 类可以定义这个这属性,限制实例能有哪些属性...__slots__ 属性 的值是一个字符串组成的元组,指明允许有的属性 如果 __slots__ 中没有 '__dict__',那么该类的实例没有 __dict__ 属性,实例只允许有指定名称的属性..., name[, default]) 从 object 对象中获取 name 字符串对应的属性 获取的属性可能来自 对象所属的类或超类 如果没有指定的属性,getattr 函数抛出 AttributeError...,可能会创建一个新属性,或者 覆盖现有的属性 vars([object]),返回 object 对象的 __dict__ 属性 如果实例所属的类定义了 __slots__ 属性,实例没有 __dict

51720

python-__getattr__ 和

不是data descriptor或者没有属性则进行第2步。 3、查找实例t的__dict__中是否有at属性,有则返回,没有则到第3步。...4、查找t的父类和祖先类的__dict__中是否有at属性,如果没有则执行第4步,如果有则执行如下步骤: ​ 4.1 at是一个non-data descriptor,调用其__get__方法,不是则执行...3.2 ​ 4.2 返回__dict__['at'] 5、如果实例t的父类中有__getattr__方法,则调用该方法,没有则抛出AttributeError。...__dict__中找到但不是data descriptor,又没有在实例的dict中找到,所以进行到了4.1步骤,发现它是一个non-data descriptor,然后就执行了其中的get方法。...,仍然会首先调用getattribute,根据属性查找原则,在实例和类中都没有找到这个属性,于是执行getattr。

39320

定制类和黑魔法

hasattr(object, name):用来检测object(适用于类、文件、模块或对象,一切皆对象)中有没有一个name字符串对应的方法或属性。...object属性key赋值value,既可以新增属性也可以修改已有属性的值。...使用__slots__一个不好的地方就是我们不能再给实例添加新的属性了,因为实例中已经没有了用来保存属性的__dict__字典,只能使用在__slots__中定义的那些属性,即类中的__slots__中定义了哪些属性...,对象也只能使用那些属性,对象不能自己去创建新属性(因为没有了__dict__),也不能修改类的属性,因为受类控制。     ...,因为我们可以完全的去自定义子类,子类中可以增加父类没有的功能,对于继承了已有对象类型的子类,我们在操作__getitem__、__setitem__、delitem__属性时,必然会跟__dict__

45010

每天一道 python 面试题 - Python反射与自省

'2.0' dir()方法,没有参数,返回当前本地作用域中的名称列表。...__dict__用于存储对象(可写)属性的字典或其他映射对象,不是所有的对象都有__dict__属性。...__dict__ #类的属性 mappingproxy({'__dict__': ,...),而非类属性 t.version 2.0 T.version #类属性没有改变 1.0 del t.version #删除实例属性, 给一个与类属性同名的实例属性赋值,我们会有效的“隐藏”类属性...绑定和方法调用 方法仅仅是类内部定义的函数,这意味着方法时类属性而不是实例属性 任何方法定义的第一个参数都是变量self,它表示调用此方法的实例对象 非绑定方法:需要调用一个还没有任何实例的类中的一个方法

67710

Python中dir,hasattr,getattr,setattr,vars的使用

一、dir([object]) dir函数的目的是交互式使用,因此没有提供完整的属性列表,只列出一组“重要的”属性名。 dir函数能审查有或没有 __dict__ 属性的对象。...dir函数不会列出 __dict__ 属性本身,但会列出其中的键。dir函数也不会列出类的几个特殊属性,例如 __mro__、__bases__ 和 __name__。...接着使用上面定义的类,我们可以获取Women对象已有的属性和方法,如果获取没有属性和方法,会报错。 如果是对象没有属性,我们可以设置默认值,则getattr会返回这个默认值。...对象没有home属性,setattr会创建home属性再给home属性赋值。 ?...五、vars([object]) 返回object 对象的 __dict__ 属性,如果实例所属的类定义了__slots__ 属性,实例没有__dict__属性,那么 vars 函数不能处理这个实例(相反

1.4K30

Python的描述符

2、属性与__dict__ Python中类有属于自己的字典属性,经过类的实例化的对象也同样有自己的字典属性,__dict__ 1 class Foo(object): 2 x=10 3...当没有set方法,有其他2个任意或所有时,又被称为非数据描述符。至少有get和set,称为数据描述符 4、描述符对象是实例属性     从上述可知描述符对象是类属性。...t.y并没有触发get方法。why???   因为调用 t.y 时,首先会去调用Test(即Owner)的 __getattribute__() 方法,该方法将 t.y 转化为Test....__dict__['y'].__get__(t, Test), 但是呢,实际上 Test 并没有 y这个属性,y 是属于实例对象的,so,忽略。...__dict__) 2 ------------- 3 {'__module__': '__main__', 'x': <__main__.Foo object at 0x000002757C138550

51220

python3--object类,继承与派生,super方法,钻石继承问题

A里面没有写init方法,怎么不报错?...里面包含了__init__方法 object带双下划线的方法,有2个名字,比如双下方法,魔术方法 任何实例化都经历3步,如果类没有init,由object完成了 例1 class Animal:     ...__dict__)  # 打印对象sam的属性 print(dog.__dict__)  # 打印对象dog的属性 执行结果 {'sex': '男'} {'kind': '哈士奇'} why?...为什么之前的属性没有了,因为自己有了init后,它不会执行父类的init方法,那么如何执行父类的init呢?...经典类:在python2.x版本才存在,且必须不继承object 遍历的时候遵循深度优先算法 没有mro方法 没有super()方法 新式类:在python2.x版本中,需要继承object,才是新式类

1.1K10

Python之关于类变量的两种赋值区别详解

就是一个向上爬属性的过程 属性:__dict__ , __class__ , __bases__ __dict__: 实例或类或模块的属性 , __class__ 实例对应的类对象,__bases__...__dict__['x'] = 3 #也可以这样 , __dict__是对象空间词典,每个对象一份,类对象/模块也有 Test.add_static_var = 5 #也可以样新增一个类属性 类方法调用..., 常用的方式object.method() ,在python中扩展 Class.method(object) ,两者相同 Test.assign(t) print(t.x) 当object.method...() 时,object被传入method(self)中的第一个参数.Class.method(object) 需要手动传入 命名空间: x = 0 def print_global(): print...#在闭包中引用本地变量 def change_in_enclosing(): x = 1 def nested(): nonlocal x x = 2 #在闭包中改变本地变量, 如没有

1.3K20
领券