__雙下劃線的方法或屬性表示是python內置的特殊方法,使用時要特別注意,大概有以下幾種
__new__
__str__
,__repr__
__iter__
__getitem__
,__setitem__
,__delitem__
__getattr__
,__setattr__
,__delattr__
__call__
可以通過重定義的方式,改寫內置方法
__new__在__init__前調用,是一種類方法,需要返回object.__new__(cls),否則無法創建類實例;
__str__
返回字符串,__repr__調試用,一般需要在命令行中看到字符串結果
__iter__for循環,可以和__next__一起使用
__getitem__像list一樣取下標,還有set del操作item
__getattr__獲取屬性值,還有set del操作attr
__call__ 調用實例
具體代碼如下
# coding:utf-8
class Car(object):
# __slots__ = ("_color", "price")
car_dict = {}
"""docstring for Car"""
def __init__(self, price):
print("__init__")
super(Car, self).__init__()
self._price = price
def __new__(cls, self):
print("__new__")
return object.__new__(cls)
def __str__(self):
return "__str__ class name: %s"%self.__class__.__name__
def __repr__(self):
return "__repr__ class name: %s"%self.__class__.__name__
def __iter__(self):
print("__iter__")
return self # 迭代對象:自身迭代
def __next__(self):
print("__next__")
self._price = self._price + 1
if self._price > 108:
raise StopIteration
return self._price
def __getitem__(self, n):
if isinstance(n, int):
a, b = 1, 1
for x in range(n):
a, b = b, a + b
return a
if isinstance(n, slice):
start = n.start
stop = n.stop
if start is None:
start = 0
a, b = 1, 1
L = []
for x in range(stop):
if x >= start:
L.append(a)
a, b = b, a + b
return L
def __getattr__(self, attr):
print("__getattr__")
if attr in self.car_dict:
return self.car_dict[attr]
else:
return "Black Default"
def __setattr__(self, attr, value):
print("__setattr__")
self.car_dict[attr] = value
def __delattr__(self, attr):
print("__delattr__")
del self.car_dict[attr]
def __len__(self):
return len(self.car_dict)
def __call__(self, name):
print("__call__")
return "%d : %s"%(self._price,name)
if __name__ == "__main__":
car1 = Car(105)
print(car1)
for i in car1:
print(i)
print(car1[13])
print(car1[2:14])
car1.color = "red"
print(car1.color)
del car1.color
print(car1.color)
print(len(car1))
car1("name")