all 用来控制 import , 甚至可以改变 _private 为 public

enter , exit 用于上下文管理器

iter 用于迭代器

repr 给计算机读, str ==》 str 给人读

len ==》 len

obj:
['__class__',
'__delattr__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__le__',
'__lt__',
'__ne__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__']

重写 +


>>> class Number(object): ... def __init__(self,value):
... self.value = value
... def __add__(self,other):
... return self.value+other.value
...
>>> Number(3)+Number(4)
7

实现类似字典操作

>>> class A(dict):
... def __getitem__(self,key):
... return super(A,self).__getitem__(key)
... def __setitem__(self,key,value):
... return super(A,self).__setitem__(key,value)
... def __delitem__(self,key):
... return super(A,self).__delitem__(key)
...
>>> a = A()
>>> a['name'] = 'Frank'
>>> a['age'] = 18
>>> print('name: {}\nage:{}'.format(a['name'],str(a['age'])))

实现getattr , setattr , del b.x 方法

>>> class B(object):
... x = []
... def __getattribute__(self,name):
... return super(B,self).__getattribute__(name)
... def __setattribute__(self,name,value):
... return super(B,self).__setattribute__(name,value)
... def __delattribute__(self,item):
... return super(B,self).__delattribute__(item)
...
>>> b = B()
>>> b.x
[]
>>> getattr(b,'x')
[]
>>> b.x = 1
>>> getattr(b,'x')
1
>>> setattr(b,'y','2')
>>> b.y
'2' >>> del b.y

原文如下:

很多pythonic的代码都会用到内置方法,根据自己的经验,罗列一下自己知道的内置方法。

getitem setitem delitem

这三个方法是字典类的内置方法,分别对应于查找、设置、删除操作,以一个简单的例子说明:

class A(dict):

def getitem(self, key):

print 'getitem'

return super(A, self).getitem(key)

def __setitem__(self, key, value):
print '__setitem__'
return super(A, self).__setitem__(key, value) def __delitem__(self, key):
print '__delitem__'
return super(A, self).__delitem__(key)

a = A()

a[1] = 1

b = a[1]

del a[1]

a.get(1)

上面的代码中a[1] = 1实际上调用的就是a.setitem(1, 1), a[1]调用的是a.get__item(1), del a[1]调用的是a.setitem(1)。需要注意的是,字典示例的get方法和__getitem__方法不存在调用关系,两者互不影响。

getattribute getattr setattr delattr

__getattribute__和__getattr__都是从python对象示例中获取成员变量的方法,差别在于__getattribute__在任何时候都会调用,而__getattr__只有在__getattribute__执行完成之后并且没有找到成员变量的时候才会执行。__setattr__在给成员变量赋值的时候调用,__delattr__在回收成员变量的时候调用,一下面的例子说明:

class A(object):

x = []

def __getattribute__(self, name):
print '__getattribute__'
return super(A, self).__getattribute__(name) def __setattr__(self, key, value):
print '__setattr__'
return super(A, self).__setattr__(key, value) def __getattr__(self, item):
print '__getattr__' def __delattr__(self, item):
print '__delattr__'
return super(A, self).__delattr__(item)

a = A()

a.x

a.y

b = getattr(a, 'x')

b = getattr(a, 'y')

a.x = 1

a.y = 1

setattr(a, 'x', 1)

setattr(a, 'y', 1)

del a.x

del a.y

因为x是a的成员变量,a.x会调用a.getattribue('x'),而y不是a的成员变量,在调用a.getattribue('y')之后还会调用a.getattr('y'),内置方法getattr也是按照此顺序调用,唯一的区别在于getattr在成员变量不存在的时候不会抛出异常,而是给一个默认值。a.x = 1和setattr(a, 'x', 1)都会调用a.setattr('x', 1),如果原来的成员变量不存在,__setattr__会给实例增加一个成员变量,而不是抛出异常。

call

如果重载了__call__方法,则实例对象就可以像方法一样调用了。如果实例a的类实现了这个方法,那么a(args, **kwargs)就会调用a.call(args, **kwargs)。用这种方法可以简单方便的实现装饰器,如下所示:

class A(object):

def init(self, func):

self.func = func

def __call__(self, *args, **kwargs):
print '__call__'
return self.func(*args, **kwargs)

@A

def foo(x):

return x

foo(1)

装饰器语法糖相当于foo = A(foo), 和闭包不同,foo已经不是一个函数而是类A的实例。foo(1)会执行foo.call(1)。当然这个例子实现的装饰器并不好,会改变foo的函数签名,而且也不能装饰类方法。

此外元类的__call__也可以控制实例的创建过程,因为当类创建对象时,元类的__call__函数就被调用,进而调用type.__call__创建对象,type.__call__回依次调用类的__new__和__init__生成实例。以单例模式为例:

class Singleton(type):

def call(cls, args):

print "Singleton call"

if not hasattr(cls, 'instance'):

cls.instance = super(Singleton, cls).call(
args)

return cls.instance

class Cache(object):

__metaclass__ = Singleton

def __new__(cls, *args):
print "Cache new"
return object.__new__(cls, *args) def __init__(cls, *args, **kwargs):
print "Cache init"

a = Cache()

b = Cache()

print a is b

get set

这三个方法分别对应于描述器的查询、设置、删除函数,还是以一个简单的例子来说明:

class A(object):

def __get__(self, instance, owner):
print '__get__' def __set__(self, instance, value):
print '__set__'

class B(object):

a = A()

b = B()

c = b.a

b.a = 1

类A的示例a作为b的成员变量时候,访问示例b中成员变量a的时候会调用a.get(b, B),修改b中成员变量a的时候会调用a.set(b, 1)。需要注意的是,当用B.a访问的时候参数instance为None。实际上像classmethod,staticmethod这样的装饰器都是通过装饰器来实现的,通过装饰器就可以解决上面不能作为类方法装饰器的问题。

import types

class Profiled(object):

def init(self, func):

self.func = func

def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs) def __get__(self, instance, owner):
if instance is None:
return self
else:
return types.MethodType(self, instance)

class Spam(object):

@Profiled

def bar(self, x):

return x + 1

s = Spam()

print s.bar(5)

在__get__方法中,不是Spam.bar调用,则instance不为None的情况下,会用types.MethodType把bar和s做一个绑定,s.bar(5)等价于执行了bar.get(s, Spam).call(5),看起来很绕,但实际上用起来很方便。

python 内建函数专题的更多相关文章

  1. python 内建函数setattr() getattr()

    python 内建函数setattr() getattr() setattr(object,name,value): 作用:设置object的名称为name(type:string)的属性的属性值为v ...

  2. python 内建函数 filter,map和reduce

    python 内建函数 filter,map和reduce, 三个函数比较类似,都是应用于序列的内置函数,常见的序列包括list.tuple.str等.而且三个函数都可以和lambda表达式结合使用. ...

  3. IBM Python 技术专题

    Python 技术专题 Python 是由 Guido van Rossum 开发的,可免费获得的.是一种非常高级的解释型语言.其语法简单易懂,而且面向对象的语义功能强大又灵活,Python 可以广泛 ...

  4. Python内建函数-callable

    Python内建函数-callable callable(object) 中文说明:检查对象object是否可调用.如果返回True,object仍然可能调用失败:但如果返回False,调用对象ojb ...

  5. 转:python教程专题资源免费下载整理合集收藏

    python教程专题资源免费下载整理合集收藏 < Python学习手册(第4版)>(Learning Python, 4th Edition)[PDF] 94MB 简体中文 <Pyt ...

  6. Python内建函数enumerate()用法及在for循环应用

    Python 内建函数enumerate() 由于这个单纯很长,不容易记住,用法还是比较广泛的,下面讲述Python内建函数enumerate()用法. 1,实例 enumerate(sequence ...

  7. Python内建函数reduce()用法

    reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,下面讲述Python内建函数reduce()用法. ...

  8. python内建函数-数字相关

    本篇对于数字有关的内置函数进行总结. 数字包括 int() , long() , float() , complex() ,这些函数都能够用来进行数值类型的转换.同时这些函数也接受字符串参数,返回字符 ...

  9. python 内建函数 type() 和 isinstance() 介绍

    Python 不支持方法或函数重载, 因此你必须自己保证调用的就是你想要的函数或对象.一个名字里究竟保存的是什么?相当多,尤其是这是一个类型的名字时.确认接收到的类型对象的身份有很多时候都是很有用的. ...

随机推荐

  1. Eclipse版本列表

    https://wiki.eclipse.org/Older_Versions_Of_Eclipse http://blog.csdn.net/jaycee110905/article/details ...

  2. [代码]--python爬虫联系--爬取成语

    闲来无事,玩了个成语接龙,于是就想用python爬取下成语网站上的成语,直接上代码: #coding=utf-8 import requests from bs4 import BeautifulSo ...

  3. BZOJ1251序列终结者——非旋转treap

    题目描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...

  4. BZOJ4448[Scoi2015]情报传递——主席树+LCA

    题目描述 奈特公司是一个巨大的情报公司,它有着庞大的情报网络.情报网络中共有n名情报员.每名情报员口J-能有 若T名(可能没有)下线,除1名大头目外其余n-1名情报员有且仅有1名上线.奈特公司纪律森严 ...

  5. BZOJ4942 NOI2017整数(线段树)

    首先把每32位压成一个unsigned int(当然只要压起来能过就行).如果不考虑进/退位的话,每次只要将加/减上去的数拆成两部分直接单点修改就好了.那么考虑如何维护进/退位.可以发现进位的过程其实 ...

  6. Spring StringRedisTemplate 配置

    1 先看pom.xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>c ...

  7. Catenyms POJ - 2337(单词+字典序输出路径)

    题意: 就是给出几个单词 看能否组成欧拉回路或路径  当然还是让输出组成的最小字典序的路 解析: 还是把首尾字母看成点   把单词看成边 记录边就好了 这题让我对fleury输出最小字典序又加深了一些 ...

  8. UUID类型如何比较是否相等

    直接使用equals方法 UUID x = UUID.fromString("062db347-6a72-69a1-40c0-7516e0a26459"); UUID y = UU ...

  9. SQL中on条件与where条件的区别

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户.  在使用left jion时,on和where条件的区别如下:   1.on条件是在生成临时表时使用 ...

  10. JAVA 泛型方法 和 静态方法泛型

    /* //  泛型方法和静态方法泛型 泛型类定义的泛型 在整个类中有效 如果被方法使用 那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定 为了让不同方法可以操作不同类型  而且类型还 ...