python 定製類

__雙下劃線的方法或屬性表示是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")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章