Python的property _getter和setter方法【转】

当给属性赋值的时候,使用实例.属性=属性值的方式显然把属性暴露出来了,并且也无法对属性值进行限制检查,java中提供了setter和getter方法,那么python是如何做的呢?更多内容请参考:Python学习指南

属性赋值方法

在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:

s = Student()
s.score = 9999

上面的赋值显然不符合实际情况,为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数:

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

现在,对任意的Student实例进行操作,就不能随心所欲地设置score了:

>>>s = Student()
>>>s.set_score(60)
>>>s.get_score()
60
>>>s.set_score(9999)
Traceback (most recent call last):
  ...
ValueError: score must between 0 ~ 100!

但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。

有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?对于追求完美的Python程序员来说,这是必要要做到的!

还记得装饰器(secorator)可以给函数添加上功能吗?对于类的方法,装饰器一样其作用。Python内置的@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 = score

@property的实现比较复杂,我们先考察如何使用。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:

>>> 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! 

注意到这个神奇的@property,我们都在对实例操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。

还可以定义只读属性,只定义getter方法,不定义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

上面的birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。

小结

@property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。

class Person(object):
def __init__(self,age):
self.age=age

@property
def age(self):
return self._age

@age.setter
def age(self,age):
self._age=age

@property
def birth(self):
return 2017-self._age

p = Person(20)
>>>print(p.age)
>>>print(p.birth)

>>>p.birth = 1997
Attribute error #birth不存在setter方法

转自

https://www.cnblogs.com/mzc1997/p/7663052.html

https://www.cnblogs.com/miqi1992/p/8343234.html

原文地址:https://www.cnblogs.com/paul8339/p/12150036.html

时间: 2024-07-31 12:03:30

Python的property _getter和setter方法【转】的相关文章

@property 取代getter setter方法

利用私有属性 class Money(object): def __init__(self): self.__money = 0 def getMoney(self): return self.__money def setMoney(self, value): if isinstance(value, int): self.__money = value else: print("error:不是整型数字") 定义一个property属性 class Money(object): d

python3的getter方法setter方法以及property修饰

class Dog: def __init__(self,name,age): self.__name = name self.__age = age @property def age(self): return self.__age @age.setter def age(self,age): self.__age = age @property def name(self): return self.__name @name.setter def name(self,name): self

python中@property的作用和getter setter的解释

@property作用: python的@property是python的一种装饰器,是用来修饰方法的. 我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改. 1.修饰方法,让方法可以像属性一样访问. class DataSet(object): @property def method_with_property(self): ##含有@property return 15 def m

@property和@synthesize快速生成getter setter方法

//@property: 可以自动生成某个成员变量的setter和getter声明,用于类的.h文件中 @property int age; 相当于 - (void)setAge:(int)age; - (int)age; 同一类型的数据写法 @property int age,age1; //@synthesize:自动生成age的setter和getter的实现 @synthesize age = _age 相当于 - (void)setAge:(int)age { _age = age;

Python——property(使一个方法看起来就像类属性一样)

""" 装饰器property:     使一个方法看起来就像类属性一样 """ #例子1 class A:     def __init__(self,  x, y):         self.__x = x #私有变量         self.__y = y def __add(self): #私有方法         return self.__x + self.__y @property     def sum(self): #通过p

python使用@property @x.setter @x.deleter

@property可以将python定义的函数"当做"属性访问,从而提供更加友好访问方式,但是有时候setter/deleter也是需要的. 1>只有@property表示只读. 2>同时有@property和@x.setter表示可读可写. 3>同时有@property和@x.setter和@x.deleter表示可读可写可删除. class student(object): #新式类 def __init__(self,id): self.__id=id @pro

写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name,

写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name 写一个 setter 方法用于完成 @property (nonatomic, copy) NSString *name 答: // retain - (void)setName:(NSString *)str { [str retain]; [_name release]; _name = str; } // copy - (void)setName:(NSString

Python面向对象高级编程:@property--把方法变为属性

为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数: 1 >>> class Student(object): 2 def get_score(self): 3 return self.__score 4 def set_score(self,value): 5 if not isinstance(value,int): 6 raise ValueError('sec

python中@property的使用

python中@property的使用 @property的作用是把一个getter方法变成属性,@xxx.setter把setter方法变成属性赋值. #coding:utf-8 class Screen(object): @property def width(self): return self._width @width.setter def width(self,value): if not isinstance(value,int): raise ValueError('width