zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    获取各种屏幕宽度、高度
    java中获取本地文件的编码
    线程通信与进程通信的区别
    女性长期没有性生活有什么危害?
    面试中你必须要知道的语言陷阱
    当项目出现空闲时候,如何开展软件测试工作?
    同样是做鸭的 绝味与周黑鸭的区别咋那么大?!
    javaIO(二)
    (原)代码块
    this的使用
  • 原文地址:https://www.cnblogs.com/roger9567/p/4598261.html
Copyright © 2011-2022 走看看