Python Class特性摘要及@property使用

与静态语言(java等)相比,python的类使用比较灵活,除了继承、封装、多态之外,还有很多特性:

  • 实例的属性可随时添加、更改(但可通过__slots__限制);类的属性也可通过实例对象访问
  • 支持多重继承
  • 可以定制类的内置方法,改变类的行为模式。比如添加类的__iter__方法,实现迭代器的功能
  • @property和元类:动态改变类的功能

本节主要介绍@property使用


#!/usr/bin/env python
#-*- coding:utf-8 -*-

__author__="Alex Yean"
__date__='2015-10-22'

'@property的使用'

print "绑定属性时我们直接调用,虽然写起来简单,但是没办法做校验。为了限制该漏洞,可以用get/set方法"

class Student(object):
    def __init__(self,score=15):
        self.__score=score

    def get_score(self):
        return self.__score

    def set_score(self,score):
        if not isinstance(score,int):
            raise ValueError("score is not integer!")
        elif score<0 or score>100:
            raise ValueError("score is not in 1-100!")
        else:
            self.__score=score

a=Student()
print '__score属性的值a.get_score():',a.get_score()
a.set_score(30)
print '__score属性的值a.get_score():',a.get_score()

print "*"*40
#@property
class StudentN(object):
    @property
    def score(self):
        return self.__score
    @score.setter
    def score(self,score):
        if not isinstance(score,int):
            raise ValueError("score is not integer!")
        elif score<0 or score>100:
            raise ValueError("score is not in 1-100!")
        else:
            self.__score=score

b=StudentN()
b.score=5
print b.score

@property装饰器就是把函数score变为类的属性,可以避免直接修改属性的问题,隐藏内部变量。

除了装饰器之外,也可以用属性来设置。 area = property(___get_area, ___set_area,doc=”"”Gets or sets the area of the square.”””)”

除了getter/setter之外,还可以设置deleter。


写于2015-12-23

选自《廖雪峰的官方网站

Loading Disqus comments...
Table of Contents