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)

 

posted @ 2015-06-24 18:09  roger9567  阅读(178)  评论(0编辑  收藏  举报