定制类

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

 

posted on 2016-06-17 22:21  张明明_1  阅读(197)  评论(0编辑  收藏  举报

导航