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)

 

你可能感兴趣的:(python)