python学习笔记-2(OOP)

来源:互联网 发布:湖南有色行情分析软件 编辑:程序博客网 时间:2024/05/17 22:16

标签(空格分隔): Python


使用@property

在Python的官方帮助文档中有关于property类(built-in class)的说明(The Python Standard Library/2 Built-in Functions)

class Student(object):    def __init__(self,name='empty'):        self._name = name    def get_name(self):        return self._name    def set_name(self,name):        self._name = name    def del_name(self):        del self._name    name = property(get_name, set_name, del_name, 'i am the property sample')foo = Student("xiaoming")print (foo.name)foo.name  = 'haizhen'print (foo.name)del foo.name

通过上面的例子可以看出,property可以使得类属性的访问、设置即隐晦又直接(把普通的赋值语句与方法联系在一起)。因为property还可以作为装饰器,一个property对象有getter,setter,和deleter三个方法,因此对于上面的例子还可以有另外一种写法:

class Student(object):    def __init__(self,name='empty'):        self._name = name    @property    def name(self):        return self._name    @name.setter    def name(self,name):        self._name = name    @name.deleter       def name(self):        del self._namefoo = Student("xiaoming")print (foo.name)foo.name  = 'haizhen'print (foo.name)del foo.name

如果不定义setter那么就相当于是一个只读属性:

class Student(object):    @property    def birth(self):        return self._birth    @birth.setter    def birth(self, value):        self._birth = value    @property    def age(self):        return 2015 - self._birth

上面的例子中,age就是只读的

练习:利用@property给一个Screen对象增加width与height属性,以及一个只读属性resolution

解答:

class Screen(object):    @property    def width(self):        return self._width    @width.setter    def width(self,width):        self._width = width    @property    def height(self):        return self._height    @height.setter    def height(self,height):        self._height = height        @property    def resolution(self):        return self._height * self._widthbar = Screen()bar.width = 3480bar.height = 2160print(bar.resolution)
0 0