python 中面向对象编程简单总结3--定制类
声明:资源来自慕课网python学习课程,以下只是个人学习总结,仅供参考
1.Python类的特殊方法
特征:以 __ 开头并结尾的方法,比如用于print的__str__() , __getattr__(),__setattr__()等
不需要在代码中直接调用, Python的某些函数和操作符会自动调用。
可以自己定制实现,如__str__()方法
class Person(object): def __init__(self,name,gender): self.name = name self.gender = gender def __str__(self): return '(Person: %s , %s )' % (self.name,self.gender) print Person("Roger","Male")
python定义了__str__() 和 __repr__()两个方法,前者显示给用户, 后者显示给开发人员,所以如果在交互命令行下修改了__str__(),再调用的话可能会没有调用修改的,而是调用了__repr__()。也可以让两个方法相同: __repr__ = __str__
2.特殊的setter和getter
在python中对应setter和getter可以由装饰器来写,从而使得调用的时候显得比较直接;当然,使用java中类似的方式也可以。由于python支持高阶函数,所以可以用装饰器把get/set方法装饰成属性。
class Student(object): def __init__(self, name, score): self.name = name self.__score = score @property #装饰get方法 def score(self): return self.__score @score.setter #装饰set方法,是@property装饰后的副产品 def score(self, score): if score < 0 or score > 100: raise ValueError('invalid score') self.__score = score #装饰之后,可以想使用属性一样设置score了 s = Student("Bob",59) s.score = 60 print s.score s.score = 1000 print s.score #会有异常,因为检查了score的范围
3.限制当前类所能拥有的属性: __slots__
class Student(object): __slots__ = ('name', 'gender', 'score') def __init__(self, name, gender, score): self.name = name self.gender = gender self.score = score
4.可调用对象(对象也能调用)
Python中函数是对象,称为可调用对象,一个类的实例也可以变成一个可调用对象,只需要实现一个特殊的方法 __call__()
class Person(object): def __init__(self,name,gender): self.name = name self.gender = gender def __call__(self, *args, **kwargs): #实现__call__方法让实例可被调用 print args
class Fib(object): def __call__(self, num): a, b, L = 0, 1, [] for n in range(num): L.append(a) a, b = b, a + b return L f = Fib() print f(10)