码迷,mamicode.com
首页 > 其他好文 > 详细

13 内建属性 _getattribute_ 内建函数

时间:2017-12-01 16:39:25      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:python   tar   print   init   log   png   没有   tca   函数   

1.内建属性

技术分享图片

 

2.__getattribute__ 属性访问时拦截器

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

    #属性访问时拦截器,打log
    def __getattribute__(self,obj):   #obj---->  subject
        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

 

 带方法的

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

    #属性访问时拦截器,打log
    def __getattribute__(self,obj):
        print("====1>%s"%obj)
        if obj == "subject1":
            print("log subject1")
            return "redirect python"
        else:
            temp = object.__getattribute__(self,obj)
            print("===2>%s"%str(temp))
            return temp

    def show(self):
        print("thi si Itcast")

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

s.show()

 

====1>subject1
log subject1
redirect python
====1>subject2
===2>cpp
cpp
====1>show
===2><bound method Itcast.show of <__main__.Itcast object at 0x7efe2d627898>>
thi si Itcast

 

 

 

3 __getattribute__的坑

class Person(object):
        def __getattribute__(self,obj):
            print("---test---")
            if obj.startswith("a"):
                return "hahha"
            else:
                return self.test   
              #return object.__getattribute__(self,obj) #扔给父类给你处理
 

        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
        

 

 

 4。内建函数

 

13 内建属性 _getattribute_ 内建函数

标签:python   tar   print   init   log   png   没有   tca   函数   

原文地址:http://www.cnblogs.com/venicid/p/7942913.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!