1.复习一下dir()和__dict__.
>>> class C(object):
pass
>>> c=C()
>>> dir(C)
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘,
‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]
>>> dir(c)
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘,
‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]
>>> c.__dict__
{}
>>> c.bar=‘rao‘
>>> dir(c)
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘,
‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘,
‘bar‘]
>>> dir(C)
[‘__class__‘, ‘__delattr__‘, ‘__dict__‘, ‘__doc__‘, ‘__format__‘, ‘__getattribute__‘, ‘__hash__‘, ‘__init__‘, ‘__module__‘,
‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘, ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘, ‘__weakref__‘]
>>> c.__dict__
{‘bar‘: ‘rao‘}
可以看出实例的dir(c)包括类的dir(C)加上实例自己的数据属性。
而实例的__dict__则仅仅是他的数据属性,(实例也没有方法属性)
内建类型中可以用dir(),不可以用__dict__
2.
实例仅有两个特殊属性(见表13.2)。对于任意对象I:
表13.2 特殊实例属性
I.__class__ 实例化I 的类
I.__dict__ I 的属性
从标准类型派生(标准类型分两种:可变类型,不可变类型)
可变类型(list的值改变了但是id没有变化,id(list)一直不变化):list,dict
不可变类型:string,int,tuple
class RoundFloat(float):
def __new__(cls, val):
return float.__new__(cls, round(val, 2))
#return super(RoundFloat,cls).__new__(cls,round(val,2))
tips:所有的__new()__方法都是类方法,我们要显式传入类作为第一个参数(cls),这类似于常见的方法如__init__()中需要的self
类、实例和其他对象的内建函数:
issubclass(sub,sup)
isinstance(obj1,obj2)
hasattr(), getattr(),setattr(), delattr()有两个参数,第一个是正在处理的对象,第二个就是属性名,是属性的字符串名字
对于每个定义的类都有一个名为__mro__的属性,她是一个元组,按照他们被搜索时的顺序,列出了被搜索的类。super()是用来解决多重继承的问
题的,而且只能作用于新式类上。super()用来调用父类非绑定的方法
vars()
vars()内建函数与dir()相似,只是给定的对象参数都必须有一个__dict__属性。vars()返回一
个字典,它包含了对象存储于其__dict__中的属性(键)及值。如果提供的对象没有这样一个属性,
则会引发一个TypeError 异常。如果没有提供对象作为vars()的一个参数,它将显示一个包含本地
名字空间的属性(键)及其值的字典,也就是,locals()。我们来看一下例子,使用类实例调用vars():
用特殊方法定制类:
class Time60(object):
def __init__(self,hr,min):
self.hr=hr
self.min=min
def __str__(self):
return ‘%d:%d‘%(self.hr,self.min)
__repr__=__str__
def __add__(self,other):
hour=self.hr+other.hr
mins=self.min+other.min
if mins>60:
return self.__class__(hour+1,mins-60)
else:
return self.__class__(hour,mins)
def __sub__(self,other):
return self.__class__(abs(self.hr-other.hr),abs(self.min-other.min))
mon=Time60(10,30)
tue=Time60(11,55)
print mon-tue
随机序列迭代器:
要想自定义的类的实例可以迭代必须加载iter方法
def __iter__(self):
return self
from random import choice
class RandSeq(object):
def __init__(self,seq):
self.data=seq
def __iter__(self):
return self
def next(self):
return choice(self.data)
def __str__(self):
return str(self.data)
rand=RandSeq([1,2,3,4,5])
for eachItem in rand:
print eachItem
class AnyIter(object):
def __init__(self,data,safe=False):
self.safe=safe
self.iter=iter(data)
def __iter__(self):
return self
def next(self,howmany):
retval=[]
for eachItem in range(howmany):
try:
retval.append(self.iter.next())
except StopIteration:
if self.safe:
break
else:
raise
return retval
a=AnyIter(range(10))
i=iter(a)
for j in range(1,5):
print j,‘:‘,a.next(j)
,
question:这个例子中我不明白为什么要设置i=iter(a),然后调用print j,‘:‘,i.next(j),我发现直接调用我写的 print j,‘:‘,a.next(j)
也是生成同样的结果哎。。。
*多类型定制(NumStr)
class NumStr(object):
def __init__(self,num=0,str=‘‘):
self.num=num
self.str=str
def __str__(self):
return "[%d::%r]"%(self.num,self.str)
__repr__ = __str__
def __add__(self,other):
return self.__class__(self.num+other.num,self.str+other.str)
def __mul__(self,num):
if isinstance(num,int):
return self.__class__(self.num*num,self.str*num)
else:
raise TypeError,‘Illegal argument type for built-in operation‘
def __nonzero__(self):
return self.num or len(self.str)
def __norm_cval(self,cmpres):
return cmp(cmpres,0)
def __cmp__(self,other):
return self.__norm_cval(cmp(self.num,other.num))+self.__norm_cval(cmp(self.str,other.str))
a=NumStr(2,‘rao‘)
b=NumStr(3,‘yuan‘)
print a>b
包装的定义: