1. 程式人生 > >自定義的類創建的對象使用len(x)函數和abs(x)函數

自定義的類創建的對象使用len(x)函數和abs(x)函數

def 整數 ash while doc 內部使用 容器類 bsp new

class Mylist:
‘‘‘自定義的容器類,內部使用內建的列表保存數據‘‘‘
def __init__(self, iterable):
self.data = [x for x in iterable]

def __repr__(self):
return "Mylist(%s)" % self.data

def __len__(self):
‘‘‘此方法是len()函數調用,此方法返回的必須是整數‘‘‘
count = 0
for x in self.data:
if x:
count += 1
return count
# return len(self.data) # 或者直接寫這個,因為self.data是列表類型
# return len(self) # 這裏出現遞歸調用,最終報錯

def __abs__(self):
# for x in self.data: # 這裏是遍歷元素,不可行
# if x < 0:
# x = -x


# 正確方法一
i = 0
while i < len(self.data):
if self.data[i] < 0:
self.data[i] = -self.data[i]
i += 1
return self.data
# 正確方法二
# L = [abs(x) for x in self.data] # 這裏是可行的,數字類型是有內建的__abs__()方法
# return L

myl = Mylist([1,-2,3,-4])
print(myl) # <__main__.Mylist object at 0x000001FDFD4E42E8>,沒有重寫__str__的時候
# Mylist([1, 2, 3, 4]) 重寫__str__的時候
# print(len(myl)) # 著了會報錯,因為object裏面沒有定義__len__,這個類裏面自己也沒有定義,要定以後才能使用
# dir(object)
# [‘__class__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__gt__‘,
# ‘__hash__‘, ‘__init__‘, ‘__init_subclass__‘, ‘__le__‘, ‘__lt__‘, ‘__ne__‘, ‘__new__‘, ‘__reduce__‘, ‘__reduce_ex__‘,
# ‘__repr__‘, ‘__setattr__‘, ‘__sizeof__‘, ‘__str__‘, ‘__subclasshook__‘]
print(len(myl))

myl2 = abs(myl)
print(myl2)

自定義的類創建的對象使用len(x)函數和abs(x)函數