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")

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值