首页
学习
活动
专区
圈层
工具
发布

从 Python 的魔法方法说开去

_stream) popen()返回了一个_wrap_close对象,而后者仅仅是一个 Iterable,而不是 Iterator(没有定义__next__())。...然而,_wrap_close却定义了__getattr__()魔法方法,这样所有其他找不到的属性、方法就会传递给self._stream对象,而这个对象有__next__()方法。这就解释了为什么r....__next__()能调用成功。 所以,Python 对于魔法方法的调用是基于这个类有没有定义此方法吗?...下面这段是额外的思考,可能比较绕: 再回头去看最开始的例子,这个问题之所以奇怪,是因为它用了__getattr__()让实例获得了并不存在于类中的属性。也就是说,原来的类并没有获得这些额外的属性。...明明Foo能获取到__next__()属性,看来(Py_TYPE(obj)->tp_iternext并不会触发__getattr__。

47920
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Python进阶——如何正确使用魔法方法?(上)

    如果我们显示执行 del obj,如下: a = Person() del a # 手动销毁对象 print 'exit' # Output: # __del__ # exit 同样地,由于实例没有被其他对象所引用...__getattr__ 再来看 __getattr__,由于我们在 __setattr__ 中忽略了对 gender 属性的赋值,所以当访问这个不存在的属性时,会调用 __getattr__ 方法,在这个方法中返回了默认值...其实不然,__getattr__ 只有在访问「不存在的属性」时才会被调用,这里我们需要注意。...很多人经常把这个方法和 __getattr__ 混淆,通过例子我们可以看出,它与前者的区别在于: __getattr__ 只有在访问不存在的属性时被调用,而 __getattribute__ 在访问任意属性时都会被调用...__getattr__ 只针对属性访问,而__getattribute__ 不仅针对所有属性访问,还包括方法调用 在上面的例子,虽然我们没有定义 money 属性和 hello 方法,但是在 __getattribute

    1.1K32

    优酷项目之 ORM(数据库对象关系映射)

    ,但是参数不是类中属性,如果想要通过实例化出的对象点 # 这个参数key的方式得到value值的目的,可以使用__getattr__来实现,也就是说,实例化出的对象在点这个key # 时候...def __getattr__(self, item): # 在对象获取它没有的属性和方法的时候触发 return self.get(item) # item就是传入参数的k...我们肯定知道是个对象,这个对象有点特别,他是个字典对象,因为Models继承了dict的方法 def __getattr__(self, item): return self.get...# 当把需要修改的字段名替换完了之后,这个对象就是一个‘新的已经修改好了的对象’,它包含所有的字段值,不管是修改的还是没有修改的。...# 接下来将这个对象用上面的sql方法的语句全部update。没有修改的字段继续不变,修改的字段发生变化。从而达到update的目的。

    96810

    python魔法函数__dict__和__getattr__的妙用

    python魔法函数__dict__和__getattr__的妙用。__dict____dict__是用来存储对象属性的一个字典,其键为属性名,值为属性的值。...拓展:部分内建函数不包含__dict__属性比如list,如果要查看list的属性怎么办呢,这时候用dir(list),dir方法也是查看对象的属性,包括内建对象的属性,但是它的输出形式列表,而__dict...__getattr__使用.获取属性的时候,如果该属性存在就输出其值,如果不存在则会去找_getatrr_,我们可以通过重写该方法可以实现动态属性的操作。...__会在没有查找到相应实例属性时被调用的特点,方便的通过链式调用生成对应的url,在碰到get方法的时候调用函数获取其网页源码。...可调用的对象更加的优雅,链式的操作不仅优雅而且还能很好的说明调用的接口的意义。下面展示一个__getattr__经典应用的例子,可以通过获取属性值的方式获取字典的键值。

    2.9K30

    Some question about

    对于一般的实例对象,__dict__ 会返回一个保存包含所有实例属性的独立的 dict 实例对象,对 __getattribute__ 的调用首先会访问这个 dict,并获取相应的实例属性 (这个调用会在通过描述器协议访问...class 属性之前,也会在调用 __getattr__ 之前)。...这个特殊的 proxy 对象允许你,获取那些定义在 class 而不是 class 的基类中的的属性。...默认情况下,vars(cls) 对于一个空类型,返回的对象包含三个描述器,__dict__ 用于保存实例中的属性,__weakref__ 是用于 weakref 模块的内部逻辑,__doc__ 是用于...前两个描述器可能会因为定义了 __slots__ 而消失,没有 __dict__ and __weakref__ 属性,反而会有每一个定义在 __slots__ 的属性。

    92230

    Python学习笔记整理(十五)类的编写

    >>> [x**2 for x in range(1,6)] [1, 4, 9, 16, 25 有多个迭代器的对象。 __getattr__和__setattr__捕捉属性的引用。...__getattr__方法是拦截属性点号运算。__getattr__可以作为钩子来通过通用的方式相应属性请求。 >>> class empty: ...    ...2、属性名称:对象命名空间 点号的属性名称指的是特定对象的属性,并且遵守模块和类的规则。就类和实例对象而言,引用规则增加了继承搜索这个流程。...赋值语句(object.X=value)     在进行点号运算的对象的命名空间内创建或修改属性名X,并没有其他作用。...制作子类的实例时,该实例一开始会是空的命名空间字典,但是有链接会指向它的类,让继承搜索能顺着寻找。实际上,继承树可在特殊的属性中看到,你可以进行查看。

    1.2K11

    Python 类与继承

    _className__attrName (对象名._类名__私有属性名)进行访问 class A: __secret = 123 a = A() a....() 用来调用父类(超类)的方法,若父类和超类中有同名方法,优先调用父类 Python2 用法:super(父类/超类名, self).函数名 Python3 用法:super().函数名 父类、子类、.../all 二者都是访问属性的方法,不同的是所有通过实例访问属性都会触发 __getattribute__ 方法,而当访问的属性不存在时,会继续触发 __getattr__,也就是说 __getattribute...__ 一定会在 __getattr__ 之前触发,当 __getattribute__ 有返回值时就不会再触发 __getattr__ __getattr__(self, name) self:函数中固定第一个参数...,在没有对应属性时,将触发 AttributeError object.

    1.2K40

    python-面向对象速查表-内置方法-内置函数-内置属性(只整理了部分内容)

    __init__()方法调用父类的__init__方法(super(当前类, self)....stu __getattr__ ( ....方法原理) 用del 对象.属性 删除属性时,执行 属性 被删除时才执行 del stu.age __getattribute__ 用 .访问属性时 不管该属性有没有都会执行,写了这个方法后__getattr...__dict__ __class__ 返回当前调用对象的类 __slots__ 指定该类对象能所能拥有的全部属性,减少内存开销 会将类对象的属性给限制死,视情况使用,连__dict__都会被省掉 _...__class__ 面向对象相关内置方法(python解释器内置方法) 函数 作用 注意点 案例 hasattr() 判断某个对象是否存在某个属性 返回值是True / False hasattr(p

    70310

    10-面向对象2

    __getattr__ 正常情况下,当调用类的方法或属性时,如果不存在,就会报错。...要避免这个错误,除了可以加上一个score属性外,Python还有另一个机制,那就是写一个__getattr__()方法,动态返回一个属性。...lambda: 25 只是调用方式要变为: >>> s.age() 25 注意,只有在没有找到属性的情况下,才调用__getattr__,已有的属性,比如name,不会在__getattr__中查找。...如果你把对象看成函数,那么函数本身其实也可以在运行期动态创建出来,因为类的实例都是运行期创建出来的,这么一来,我们就模糊了对象和函数的界限。 如何判断一个对象是否能被调用?...但是,如果只允许实例添加某些特定的属性是,可以通过定义一个特殊的__slots__变量,来限制该class实例能添加的属性: class Student(object): __slots__ =

    2.2K20

    如何实现类中的属性自动计算

    我们希望能够通过一种简便的方法自动计算这些属性,而无需手动编写每个属性的计算方法。2、解决方案有几种方法可以实现类中的属性自动计算。1、使用魔法方法__getattr__。...calculate_attr装饰器遍历Test类的属性列表,并为每个属性创建一个属性描述符。属性描述符是一个特殊的对象,它可以用来控制属性的访问和赋值。...']: dct[attr_name] = property(lambda self: self.calculate_attr(attr_name)) return super...在上面的代码中,MetaCalculateAttr元类遍历Test类的属性列表,并为每个属性创建一个属性描述符。属性描述符是一个特殊的对象,它可以用来控制属性的访问和赋值。...如果只需要实现少数几个属性的自动计算,可以使用魔法方法__getattr__。如果需要实现大量属性的自动计算,可以使用类装饰器或元类。

    1.4K10
    领券