python中的内建属性

版权声明:本文为小盒子原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35393693/article/details/84233657
"teachclass.py"
class Person(object):
pass

python3.5中类的内建属性和方法

经典类(旧式类),早期如果没有要继承的父类,继承里空着不写的类

#py2中⽆继承⽗类,称之经典类,py3中已默认继承object
class Person:
      pass

子类没有实现 __init__ 方法时,默认自动调用父类的。 如定义 __init__ 方法时,需自己手动调用父类的 __init__ 方法

__getattribute__ 例子:

class Itcast(object):
    def __init__(self,subject1):
        self.subject1 = subject1
        self.subject2 = 'cpp'

    #属性访问时拦截器,打log
    def __getattribute__(self,obj):
        if obj == 'subject1':
           print('log subject1')
           return 'redirect python'
        else: #测试时注释掉这2⾏,将找不到subject2
           return object.__getattribute__(self,obj)

    def show(self):
        print('this is Itcast')

s = Itcast("python")
print(s.subject1)
print(s.subject2)

运行结果:

log subject1
redirect python
cpp

__getattribute__的坑

class Person(object):
    def __getattribute__(self,obj):
        print("---test---")
        if obj.startswith("a"):
           rturn "hahha"
        else:
           return self.test

    def test(self):
        print("heihei")

t.Person()
t.a #返回hahha
t.b #会让程序死掉
    #原因是:当t.b执行时,会调用Person类中定义的__getattribute__方法,但是在这个方法的执行过程 
    #中if条件不满足,所以 程序执行else里面的代码,即return self.test 问题就在这,因为return 需 
    #要把self.test的值返回,那么首先要获取self.test的值,因为self此时就是t这个对象,所以 
    #self.test 就是t.test 此时要获取t这个对象的test属性,那么就会跳转到__getattribute__方法去 
    #执行,即此时产生了递归调用,由于这个递归过程中 没有判断什么时候推出,所以这个程序会永无休  
    #止的运行下去,因为每次调用函数,就需要保存⼀一些数据,那么随着调用的次数越来越多,最终内存吃 
    #光,所以程序崩溃
    #
    # 注意:以后不要在__getattribute__方法中调用self.xxxx

猜你喜欢

转载自blog.csdn.net/qq_35393693/article/details/84233657