13 内建属性 _getattribute_ 内建函数

Posted 不要被骄傲遮蔽了双眼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13 内建属性 _getattribute_ 内建函数相关的知识,希望对你有一定的参考价值。

 

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。内建函数

   1) range

### python2  直接生成[0-100]
In [1]: range(0,10)
Out[1]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

  2)map函数

  map函数会根据提供的函数对指定序列做映射

#函数需要一个参数
map(lambda x: x*x, [1, 2, 3])
#结果为:[1, 4, 9]

 

l1 = [ 0, 1, 2, 3, 4, 5, 6 ]  
l2 = [ \'Sun\', \'M\', \'T\', \'W\', \'T\', \'F\', \'S\' ]
l3 = map( f1, l1, l2 ) 
print(list(l3))
#结果为:[(0, \'Sun\'), (1, \'M\'), (2, \'T\'), (3, \'W\'), (4, \'T\'), (5, \'F\'), (6, \'S\')]

 

  3)filter函数

  filter函数会对指定序列执行过滤操作

filter(lambda x: x%2, [1, 2, 3, 4])
[1, 3]

filter(None, "she")
\'she\'

 

  4)reduce函数

  reduce函数,reduce函数会对参数序列中元素进行累积

reduce(lambda x, y: x+y, [1,2,3,4])
10

reduce(lambda x, y: x+y, [1,2,3,4], 5)
15

reduce(lambda x, y: x+y, [\'aa\', \'bb\', \'cc\'], \'dd\')
\'ddaabbcc\'

    

 

  5)sorted函数

    

 

5. 集合set

集合与之前列表、元组类似,可以存储多个数据,但是这些数据是不重复的

集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric_difference(对称差集)等数学运算.

>>> x = set(\'abcd\')
>>> x
{\'c\', \'a\', \'b\', \'d\'}
>>> type(x)
<class \'set\'>

>>> y = set([\'h\',\'e\',\'l\',\'l\',\'o\']) >>> y {\'h\', \'e\', \'o\', \'l\'}
>>> z = set(\'spam\') >>> z {\'s\', \'a\', \'m\', \'p\'}

>>> y&z #交集 set() >>> >>> >>> x&z #交集 {\'a\'} >>> >>> >>> x|y #并集 {\'a\', \'e\', \'d\', \'l\', \'c\', \'h\', \'o\', \'b\'} >>> >>> x-y #差集 {\'c\', \'a\', \'b\', \'d\'} >>> >>> >>> x^z #对称差集(在x或z中,但不会同时出现在二者中) {\'m\', \'d\', \'s\', \'c\', \'b\', \'p\'} >>> >>> >>> len(x) 4 >>> len(y) 4 >>> len(z) 4 >>>

 

 

 6. functools

In [23]: import functools

In [24]: dir(functools)
Out[24]: 
[\'WRAPPER_ASSIGNMENTS\',
 \'WRAPPER_UPDATES\',
 \'__builtins__\',
 \'__doc__\',
 \'__file__\',
 \'__name__\',
 \'__package__\',
 \'cmp_to_key\',
 \'partial\',
 \'reduce\',
 \'total_ordering\',
 \'update_wrapper\',
 \'wraps\']

 

  

  1)partial函数(偏函数)

把一个函数的某些参数设置默认值,返回一个新的函数,调用这个新函数会更简单。  

import functools

def showarg(*args, **kw):
    print(args)
    print(kw)

p1=functools.partial(showarg, 1,2,3)
p1()
p1(4,5,6)
p1(a=\'python\', b=\'itcast\')

p2=functools.partial(showarg, a=3,b=\'linux\')
p2()
p2(1,2)
p2(a=\'python\', b=\'itcast\')

    

  2)wraps函数

使用装饰器时,有一些细节需要被注意。例如,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变)。

添加后由于函数名和函数的doc发生了改变,对测试结果有一些影响,例如:

def note(func):
    "note function"
    def wrapper():
        "wrapper function"
        print(\'note something\')
        return func()
    return wrapper

@note
def test():
    "test function"
    print(\'I am test\')

test()
print(test.__doc__)
运行结果

note something
I am test
wrapper function

 

所以,Python的functools包中提供了一个叫wraps的装饰器来消除这样的副作用。例如:

import functools
def note(func):
    "note function"
    @functools.wraps(func)
    def wrapper():
        "wrapper function"
        print(\'note something\')
        return func()
    return wrapper

@note
def test():
    "test function"
    print(\'I am test\')

test()
print(test.__doc__)

 

运行结果

note something
I am test
test function   #原来函数的说明文档

 

以上是关于13 内建属性 _getattribute_ 内建函数的主要内容,如果未能解决你的问题,请参考以下文章

python笔记59-类里面的__getattribute__属性拦截器

python描述符property函数(类)装饰器实例解析

内建属性内建函数

Python常用内建方法:__init__,__new__,__class__的理解

Python类与对象最全总结大全(类实例属性方法继承派生多态内建函数)

python进阶之函数和类内建魔法属性