版权声明:本文为小盒子原创文章,未经博主允许不得转载。 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