Python3 魔法方法:属性访问

1、与属性访问有关的魔法方法

__getattr__(self,name)

定义当用户试图获取某一不存在的属性时的行为

__getattribute__(self,name)

定义当该类属性被访问时的行为

__setattr__(self,name,value)

定义一个属性被设置时的行为

__delattr__(self,name)

定义一个属性被删除时的行为

注意:

def __setattr__(self, name, value):
        self.name = value + 1

#此代码试图在对对象的属性进行赋值时让属性的值加1但是
self.name = value + 1这句又会触发 __setattr__从而导致无限递归

正确写法:

def __setattr__(self, name, value):
        super().__setattr__(name,value+1)
#寻找父类的__setattr__方法来对属性name赋值

或者:

def __setattr__(self, name, value):
        self.__dict__[name] = value + 1

以下的代码问题:

class Counter:
        def __init__(self):
                self.counter = 0 # 这里会触发 __setattr__ 调用
        def __setattr__(self, name, value):
                self.counter += 1
“””既然需要 __setattr__ 调用后才能真正设置 self.counter 的值,所以这时候 self.counter 还没有定义,所以没法 += 1,错误的根源。”””
                super().__setattr__(name, value)
        def __delattr__(self, name):
                self.counter -= 1
                super().__delattr__(name)

定义一个count类实现检测属性的增减

class Counter:
    def __init__(self):
        self.counter = 0
    def __setattr__(self, name, value):
        if name== ‘counter‘:
            super().__setattr__(name, value)
        else:
            self.counter += 1
            super().__setattr__(name, value)
    def __delattr__(self, name):
        if name ==‘counter‘:
            super().__delattr__(name)
        else:
            self.counter -= 1
            super().__delattr__(name)
class Counter:
        def __init__(self):
                super().__setattr__(‘counter‘, 0)
        def __setattr__(self, name, value):
                super().__setattr__(‘counter‘, self.counter + 1)
                super().__setattr__(name, value)
        def __delattr__(self, name):
                super().__setattr__(‘counter‘, self.counter - 1)
                super().__delattr__(name)

原文地址:https://www.cnblogs.com/PythonFCG/p/8436637.html

时间: 2024-10-07 14:56:56

Python3 魔法方法:属性访问的相关文章

045魔法方法:属性访问

属性访问:__getattr__(self,name)  定义当用户试图获取一个不存在的属性时的行为 __getattribute__(self,name)  定义当该类的属性被访问时的行为 __setattr__(self,name,value)  定义当用一个属性被设置时的行为 __delattr__(self,name)  定义当用一个属性被删除时的行为 例:>>> class C:  ...     def __getattribute__(self, name):       

python魔法方法-属性访问控制

属性访问控制 所谓的属性访问控制就是控制点号访问属性的行为,而且不仅是类的外部,连类的内部也受控制,代码见真章,边看代码边解释: __getattr__(self, item) 定义当访问不存在的属性时的行为,注意是不存在的属性. class Foo(object): def __init__(self, value): self.value = value def __getattr__(self, item): print item # 查看得到的参数是什么 print type(item)

Python3 魔法方法:算数运算

1.算数运算的魔法方法 在调用相应的运算符时会自动调用相应的魔法方法 比如a和b相加时(a+b)会自动调用a的__add__魔法方法进行加法操作 如果在a中找不到__add__方法python就会到b中寻找反运算的魔法方法__radd__ 2.如何在子类中调用父类的方法 使用super函数 class A: def a(self): print('正在调用A的方法') #AA=A class B(A): def b(self): print('正在调用B的方法') #super().a() su

Python3 魔法方法:定制序列

1.基于序列的三大容器 分别是 列表.元组.字符串 2.协议 python中的协议更像是一种指南,例如鸭子类型,一只鸟像鸭子一样走,像鸭子一样叫,像鸭子一样游然后这只鸟就可以叫做鸭子 3.容器类型的协议 如果希望定制的容器是不可变的,那么只需要定义__len__ 和__getitem__ 方法 如果希望定制的容器是可变的,那么还需要定义 __setitem__ 和__delitem__方法 4.魔法方法 _len__(self) 定义当被 len() 调用时的行为(返回容器中元素的个数) __g

Python3 魔法方法:迭代器

0.什么是迭代器 迭代器不是容器,而是实现了__next__方法的对象(用于遍历容器中的数据) 在python原生支持的数据结构中set(集合)是仅支持迭代器访问的,不支持下标(index)访问 1.相关的BIF iter() 将一个可迭代对象转换成一个迭代器 next() 访问迭代器中的下一个变量,如果迭代器没有变量了,则返回StopIteration异常 2.魔法方法 __iter__(self) 返回迭代器本身 __next__(self) 决定迭代的方法 3.例题: 用while语句实现

Python类属性访问的魔法方法

Python类属性访问的魔法方法: 1. __getattr__(self, name)- 定义当用户试图获取一个不存在的属性时的行为 2. __getattribute__(self, name)- 定义当该类的属性被访问时的行为 注意:当__getattr__与__getattribute__同时重写时,访问属性时,优先调用__getattribute__,只有当被访问的属性不存在时才触发__getattr__ 3. __setattr__(self, name, value)- 定义当一个

魔法方法:属性访问

__getattr__(self,name) 当用户试图访问name,而name属性不存在时就会调用getattr __getattribute__(self,name) 当用户试图访问name时就会调用getattribute __setattr__(self,name,value)当name被设置为value的时候就会调用setattr __delattr__(self,name)当name属性被删除时就会调用delattr 只有重写以上四个魔法方法,就可以改变属性访问

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__