类的内建函数和用来定制类的特殊方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类的内建函数和用来定制类的特殊方法相关的知识,希望对你有一定的参考价值。
两个类的内建函数
一:isinstance()
1 class P1(): 2 3 def __init__(self, name): 4 self.name = name 5 pass 6 7 class P2(P1): 8 A = P1(‘wang‘) # 定义类属性!! 9 B = P1(‘zi‘) 10 11 print(P2.__dict__) 12 for i, v in P2.__dict__.items(): 13 if i ==‘A‘: 14 print(v) 15 print(isinstance(v,P1))
l=‘<__main__.P1 object at 0x01DF0290>‘
print(l)
print(isinstance(l, P1))
运行结果:
{‘__module__‘: ‘__main__‘, ‘A‘: <__main__.P1 object at 0x01DF0290>, ‘B‘: <__main__.P1 object at 0x01DF0390>, ‘__doc__‘: None} <__main__.P1 object at 0x01DF0290> True
<__main__.P1 object at 0x01DF0290>
False
注意第15行,是v! <__main__.P1 object at 0x01DF0290>这种格式只能被存储,并通过变量传递,不能被赋值。
二:super()
class C(P): def __init__(self): P.__init__(self) ###等价于 class C(P): def __init__(self): super(C,self).__init__()
super用于查找是根据基类的mor()函数查找上一级的。
具体解释参考:
http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html
用来定制类的特殊方法(包括__init__构造器和__del__结构器),它们有些有默认的特定行为,而其他的则没有。
可实现:
重载操作符 + - ...
模拟标准类型 (例子二)
一:__len__内建len()函数
class dog(): def __len__(self): return 100 print(len(dog())) # 100
二:__str__ 表示可打印时的输出,__repr__表示运行时的字符串输出,rept()和‘’操纵符号
class RoundFloat2(): def __init__(self,val): assert isinstance(val,float), ‘Value must be a float‘ self.value = round(val,2)
当你
print(RoundFloat2(3.5))
是无法输出正确的数,输出的是<__main__.RoundFloat2 object at 0x01CFB430>
#要定义__str__和__repr__函数 def __str__(self): return (str(self.value) ) __repr__ = __str__
如果
class RoundFloat2(float): RoundFloat2是继承自float标准类的,就不需要重新定制,因为float类中已经定义好了__str__和__repr__。
三:迭代器
3.0中引用时用*.next()的方式会出错,用next(*)函数或者*.__next__()的方式
a=range(10) i=iter(a) # for j in range(10): # print(i.__next__()) #这样也行 for j in range(10): print(next(i))
可以自己定义一个迭代器,__iter__仅返回self,对象就被声明为迭代器。
class AnyIter(): #建立迭代器(类) def __init__(self, data, safe=False): self.safe = safe self.iter = iter(data) # iter()函数会检查你传递的是不是一个序列,如果是,用__next__函数根据索引从0迭代到序列结束 def __iter__(self): return self def __next__(self, howmany=2): #内建__next__函数 retval = [] for eachItem in range(howmany): retval.append(self.iter.__next__()) #或者用next(*)迭代 return retval for item in AnyIter(range(10)): #AnyIter(range(10))是一个迭代器,for循环语句中每一次执行一次,就会执行__next__()函数直到遍历结束。 print(item) a= AnyIter(range(10)) for j in range(1,5): print(j,‘:‘,a.__next__(j)) #主动调用__next__函数,运行结果
结果为:
[0, 1] [2, 3] [4, 5] [6, 7] [8, 9] 1 : [0] 2 : [1, 2] 3 : [3, 4, 5] 4 : [6, 7, 8, 9]
以上是关于类的内建函数和用来定制类的特殊方法的主要内容,如果未能解决你的问题,请参考以下文章