python进阶-- 04 如何定制类
1.魔术方法--定义
定义在某一类中(如object中的__str__,list中的__len__等),不需要直接调用该方法,Python中的某些函数或操作符会调用对应的特殊方法(如print调用__str__,len()调用__len__等),任何该类的派生类可以通过重写这些特殊方法,来自定义这些方法的功能。
2.魔术方法--重写原则
只编写用到的特殊方法
有关联性的特殊方法都必须实现(如__getattr__、__setattr__、__delattr__)
3.魔术方法--属性相关
构造属性的get、set、del方法
方法一:
自己编写他的get、set、del方法,并提供给外部使用,通过指定的set、get方法来进行赋值、取值
class Student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
def get_score(self):
return self.__score
def set_score(self, score):
if score < 0 or score > 100:
raise ValueError('invalid score')
self.__score = score
方法二:
使用property、setter、getter方法或者装饰器,外部可直接使用属性名来赋值、取值,不必通过指定的set、get方法
4.特殊方法--举例
4.1类方法
__new__(cls, *args,**kw)
通常用于控制生成一个新实例的过程,它是类级别的方法。
4.2实例方法
__init__(self,*args,**kw)
控制初始化一个新实例的过程。自定义“实例=类名(*args,**kw)”
__del__(self)
自定义“del 对象”方法
4.3打印相关
__str__(self)
自定义“print 实例” 或“str(实例)”方法
__repr__(s)
直接在交互行输入对象时使用
4.4s.attr方式访问
__getattr__(s, name)
自定义“实例.name”方法
__setattr__(s, name, val)
自定义“实例.name=val”方法
__delattr__(s, name)
自定义“del 实例.name”方法
4.5构造序列
__len__ (self)
自定义“len(实例)”方法
__getitem__ (self,key)
自定义“实例[key]”方法
__setitem__ (self,key,value)
自定义“实例[key]=value”方法
__delitem__(self,key)
自定义“del 实例[key]”方法
4.6构造迭代器
__iter__(self)
__next__(self)
自定义“for tmp in 实例”方法
http://www.maiziedu.com/wiki/python/special/
4.7构造可比较类
_lt_()
自定义“实例 < 实例”方法
_le_()
自定义“实例 <= 实例”方法
_gt_()
自定义“实例 > 实例”方法
_ge_()
自定义“实例 >= 实例”方法
_eq_()
自定义“实例 == 实例”方法
_ne_()
自定义“实例 != 实例”方法
__cmp__(self, other)
自定义“sorted([实例1,实例2,...])” 方法
4.8构造可运算类
_add_()
自定义“实例 + 实例”方法
_sub_()
自定义“实例 - 实例”方法
_mul_()
自定义“实例 * 实例”方法
_div_()
自定义“实例 / 实例”方法
http://www.maiziedu.com/wiki/python/special/
4.9转换类型
__int__
自定义“int(实例)”方法
__float__
自定义“float(实例)”方法
4.10其他
__slots__
目的是限制当前类所能拥有的属性(元组形式),如果不需要添加任意动态的属性,使用__slots__也能节省内存。
class Student(object):
__slots__ = ('name', 'gender', 'score')
def __init__(self, name, gender, score):
self.name = name
self.gender = gender
self.score = score
# 现在,对实例进行操作:
>>> s = Student('Bob', 'male', 59)
>>> s.name = 'Tim' # OK
>>> s.score = 99 # OK
>>> s.grade = 'A'
Traceback (most recent call last):
...
AttributeError: 'Student' object has no attribute 'grade'
__call__
自定义“实例(xx)”方法,类似于函数调用。
class Fib(object):
def __init__(self):
pass
def __call__(self,num):
if num<0:
raise ValueError('invalid score')
L=[]
L.append(0)
if num==1:
return L
L.append(1)
if num ==2:
return L
for i in range(3,num+1):
L.append(L[-1]+L[-2])
return L
f = Fib()
print f(10)
__hash__(s)
自定义“实例1 is 实例2”、“实例1 == 实例2”等方法
http://www.cnblogs.com/pengsixiong/p/5381850.html
__nonzero__(s)
将对象转为布尔值,自定义“if 实例:”方法
5.特殊语句
5.1exec语句
用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。
下面是一个简单的例子。
>>> exec 'print "Hello World"'
Hello World
5.2eval语句
用来计算存储在字符串中的有效Python表达式。下面是一个简单的例子。
>>> eval('2*3')
6
5.3assert语句
assert 语句用来声明某个条件是真的。例如,如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么 assert语句是应用在这种情形下的理想语句。当assert语句失败的时候,会引发一个AssertionError。
>>> mylist = ['item']
>>> assert len(mylist) >= 1
>>> mylist.pop()
'item'
>>> assert len(mylist) >= 1
Traceback (most recent call last):
File "", line 1, in ?
AssertionError
5.4raise语句
手动抛出异常
raise ValueError('invalid score')
6.附录
6.1python中属性详解
可以实现设置只读属性(不设置set方法);在set、get、del属性同时进行自定义动作。
http://python.jobbole.com/80955/