python__高级 : 类的__getattribute__ 方法

在类 里面,其实并没有方法这个东西,所有的东西都保存在属性里面,所谓的调用方法其实是类里面的一个同名属性指向了一个函数(方法),返回的是函数的引用,再用   函数()    这种方式就可以调用它

在调用实例的方法的时候,实际上给对象传过去的只是一个字符串而已,

比如 t = Test() , 假设 func 是 Test类的一个方法,那么 t.func() 是先给类的 __getattribute__ 方法传过去了一个 ‘func‘ 字符串 ,经过处理之后返回的是指向 func 函数的引用 ,最后 func() 就调用了这个函数(方法)

class Test:

    def __init__(self):
        self.a = 100
        self.b = 200

    def __getattribute__(self, item):
        if item == ‘a‘:
            print(‘------%s------‘ % item)
            return ‘%s is get‘ % item
        else:
            return object.__getattribute__(self, item)

t = Test()
print(t.a)

>>>------a------
   a is get

无论调用属性还是方法,都是先强制调用 __getattribute__ 方法,然后再传回属性的值或者是 函数(方法)的引用.

注意,在 __getattribute__ 方法里面 如果再用类似 self.*** 这种调用方式 ,那么是一件很不好的行为,因为 每次调用类的属性都会强制调用 __getattribute__ ,所以极有可能造成递归调用.如:

class Test:

    def __getattribute__(self, item):
        if item == ‘a‘:
            print(‘------%s------‘ % item)
            return ‘%s is get‘ % item
        else:
            return self.test  # <----------------------------------------------------------------------------

    def test(self):
        print(‘.........‘)

t = Test()
print(t.b)

>>>RecursionError: maximum recursion depth exceeded in comparison

self.test 会再次调用 __getattribute__ , 最后结果 就是 递归异常:最大递归深度超过什么什么....

原文地址:https://www.cnblogs.com/cccy0/p/9063679.html

时间: 2024-07-31 06:36:13

python__高级 : 类的__getattribute__ 方法的相关文章

python__高级 : 类当作装饰器

类在创建对象时,会调用 __init__ 初始化一些东西 , 然后 如果类中定义了 __call__ 方法,可以直接用  对象()  这种方法调用,所以可以用类来装饰函数: class Test(object): def __init__(self, func): print('----装饰-----') print('func name is %s' % func.__name__) self.__func = func def __call__(self, *args, **kwargs):

python__基础 : 类的 __slots__ 方法

实例在创建出来之后,可以动态的添加属性和方法, 那如果想要限制添加的实例属性,可以用一下 __slots__ 这个东西: class Test(object): __slots__ = ('name', 'age') # 用元组保存 t = Test() t.name = 'tt' t.age = 18 t.addr = 'shanghai' >>>t.addr = 'shanghai' AttributeError: 'Test' object has no attribute 'ad

int类中的方法

我们知道在python中,一切对象都是类,对象的方法都封装在类中,现在来探讨一下int类中的方法: 我们可以通过help(int)和dir(int)来查看int类中都封装了那些方法:     1.bit_length() def bit_length(self): # real signature unknown; restored from __doc__ """ """返回表示该数字的二进制最少位数""" int

java之七 高级类设计

static的用法 有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象.通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例.在成员的声明前面加上关键字static(静态的)就能创建这样的成员. 如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象.你可以将方法和变量都声明为static.static成员的最常见的例子是main( ).因为在程序开始执行时必须调用main(),所以它被声

OC --(2)-- 基础知识分析对象,创建类,自定义初始化方法

1.分析对象 2 创建类(实例变量 方法) 3.创建对象 调用方法 结局问题 @property int age;//相当于声明getter setter 方法; @synthesize age ; //相当于实现getter setter 方法; @synthesize age=_age ;//会去访问_age; 实例变量的可见度;         [email protected]; 公共的 在类的内部和外部都可以进行访问(破坏了面向的对象的封装特性)         [email prot

静态、抽象类、加载类、魔术方法等

静态  static关键字 普通成员普通成员是属于对象的 静态成员静态成员是属于类的 普通方法里面可以调用静态成员静态方法里面不能调用普通成员self关键字 在类里面代表该类 普通类 class Ren { public $name="张三"; public static $zhongzu; //静态成员 普通方法 function Say() { echo self::$zhongzu."你好"; } 静态类 static function Run() { ech

iOS:UIApplication类的OpenURL方法

1.调用app store界面方法 在实际开发中,往往要推荐自己其他应用和推荐自己的收费软件,那么我们就需要在程序中直接连接到app store的相应页面. 实际上的做法很简单,使用的还是UIApplication类的OpenURL方法: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"程序的相应连接"]]; 2.调用其它应用的方法 // 调用 自带mail [[UIApplicationsharedA

类的寻找方法

class A: def bar(self): print('bar') self.f1() class B(A): def f1(self): print('B') class C: def f1(self): print('C') class D(C,B): pass d1 = B() d1.bar() class C: def __init__(self): print('C的构造方法') self.ty = '动物' class A(C): def __init__(self): pri

Discuz论坛写出的php加密解密处理类(代码+使用方法)

PHP加密解密也是常有的事,最近在弄相关的东西,发现discuz论坛里的PHP加密解密处理类代码,感觉挺不错,在用的时候,要参考Discuz论坛的passport相关函数,后面我会附上使用方法,先把类代码帖上来: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 <?php /*