# 定制类
# __str__ 和 __repr__
class Student(object):
def __init__(self, name):
self.name = name
# 返回用户看到的字符串
def __str__(self):
return 'Student object (name: %s)' % self.name
# 返回程序开发看到的字符串,调试服务的。直接显示变量调用
__repr__ = __str__
print(Student('Michael'))
s = Student('Mike')
print(s)
# __iter__
'''
1. 一个类被用于for...in循环,类似list或tuple
2. 该方法返回一个迭代对象,然后,for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环
'''
# 斐波那契数列
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化两个计数器
def __iter__(self):
return self # 实例本身就是迭代对象,故返回自己
def __next__(self):
self.a, self.b = self.b, self.a + self.b # 计算下一个值
if self.a > 100000: # 退出循环条件
raise StopIteration()
return self.a #返回下一个值
# __getitem__
'''
1. 类似list那样按照下标取出元素
2. 切片方法
'''
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
for n in Fib():
print(n)
f = Fib()
print(f[0])
print(f[:3])
# __getattr__
'''
1. 调用不存在的属性时,调用该方法
'''
class Person(object):
def __init__(self):
self.name = 'Tom'
def __getattr__(self, attr):# 默认返回 None
if attr == 'score':
return 99
return AttributeError('\'Student\' object has no attribute \'%s\'' % attr)
# 链式应用
class Chain(object):
def __init__(self, path=''):
self._path = path
def __getattr__(self, path):
return Chain('%s/%s' % (self._path, path))
def __str__(self):
return self._path
__repr__ = __str__
p = Chain().status.user.timeline.list
print(p)
# __call__
'''
1. 任何一个类,只要定义一个__call__()方法,就可以直接对实例进行调用
2. 可以用callable()函数,判断一个对象是否是可调用对象
'''
class Men(object):
def __init__(self, name):
self.name = name
def __call__(self):
print('My name is %s' % self.name)
m = Men('Alex')
m()
Python:13.定制类
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 今天在学习python的定制类,教程里面展示了如何用__getitem__方法,实现某个类的切片。pythoncl...
- 1.__getitem__的简单用法: 当一个类中定义了getitem方法,那么它的实例对象便拥有了通过下标来索引...