码迷,mamicode.com
首页 > 其他好文 > 详细

第七章-面向对象高级编程

时间:2017-03-30 22:41:26      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:rom   参数   私有变量   限制   过程   mic   call   允许   error:   

1 使用__slots__

1.1 绑定属性和方法

  给实例绑定属性

class Student(object):
    pass

>>> s = Student()
>>> s.name = ‘Michael‘ # 动态给实例绑定一个属性
>>> print(s.name)
Michael

  给某个实例绑定方法

>>> def set_age(self, age): # 定义一个函数作为实例方法
...     self.age = age
...
>>> from types import MethodType
>>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
>>> s.set_age(25) # 调用实例方法
>>> s.age # 测试结果
25

  但是由于给实例绑定的方法, 别的实例无法使用

  因而需要给类绑定方法:

>>> def set_score(self, score):
...     self.score = score
...
>>> Student.set_score = set_score

1.2 限定绑定属性

  由于Python可以随意的增加属性, 因而为了针对这种情况, 可以在定义函数的时候定义__slots__来限制类里面只有哪一系属性, 这样绑定别的属性就会报错.

class Student(object):
    __slots__ = (‘name‘, ‘age‘) # 用tuple定义允许绑定的属性名称

2 使用@property

  在之前说到, 私有变量要封装在对外公开的函数上, 要生成getter和setter函数.

  但是在使用过程中, 还需要对设置的时候传入的参数进行一定的检查.

class Student(object):

    def get_score(self):
         return self._score

    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError(‘score must be an integer!‘)
        if value < 0 or value > 100:
            raise ValueError(‘score must between 0 ~ 100!‘)
        self._score = value

  为了追求完美, Python提供一个处理getter和setter的装饰器: Property

class Student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError(‘score must be an integer!‘)
        if value < 0 or value > 100:
            raise ValueError(‘score must between 0 ~ 100!‘)
        self._score = value

  经过这样的处理之后

>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!

  

 

  

第七章-面向对象高级编程

标签:rom   参数   私有变量   限制   过程   mic   call   允许   error:   

原文地址:http://www.cnblogs.com/weihuchao/p/6648875.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!