定制类
class Student(object): pass s = Student() s.name = 'Michael' print(s.name) def set_age(self, age): self.age = age from types import MethodType s.set_age = MethodType(set_age, s) #给实例绑定一个方法 s.set_age(25) print(s.age) #注意给一个实例绑定的方法对于另一个实例是不起作用的 s2 = Student() #创建新的实例 #为了给所有的实例都绑定方法,可以给class绑定方法 def set_score(self, score): self.score = score Student.set_score = set_score s.set_score(100) print(s.score) s2.set_score(99) print(s2.score) #如果我们想限制类的属性,比如,只允许对Student实例添加name和age属性 #__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的: #除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__。 class Student(object): __slots__ = ('name', 'age') s = Student() s.name = 'Michael' s.age = 25 #s.score = 99 #因为__slots__('name', 'age')限制Student实例只能添加name和age属性 class Teacher(object): def __init__(self, name, subject): self.name = name self.subject = subject t = Teacher('wangxin', 'math') print(t.name) print(t.subject) class Student(object): def __init__(self, name): self.name = name print(Student('Michael')) 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')) 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 for n in Fib(): print(n) #要表现得像list那样按照下标取出元素,需要实现__getitem__()方法: class Fib(object): def __getitem__(self, n): a, b = 1, 1 for x in range(n): a, b = b, a+b return a f = Fib() print(f[0]) print(list(range(100))[5:10]) class Fib(object): def __getitem__(self, n): if isinstance(n, int): 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 f = Fib() print('---------') print(f[0:5])