python的属性(property)使用

时间:2023-03-08 19:04:51
python的属性(property)使用

在面向对象编程的时候,我们定义一个Person

class Person:
def __init__(self):
self.age = 22

这样写法能够方便的访问属性age,

p = Person()
print p.age ==>22
p.age = 30
print p.age ==>30

这样写起来虽然很简单,但是没有参数检验(eg,输入非数值,输入过大的数值)。

写过Java的人知道,在Java有一种类叫做实体类(entity,javabean等),它们一般不提供其他复杂的方法只提供简单的gettersetter等方法。如下例子

public class person{
private int age;
public String getAge()
{
return this.age;
}
public String setAge(String age)
{
if(age > 100) {}//数值检验
return this.age=age;
}
}

同理我们可以按照这个思路来编写python代码

class Person:
def __init__(self):
self.age = None
def get_age(self):
return self.age
def set_age(self,age):
if not isinstance(age, int):
raise ValueError('age must be an integer!')
if age < 0 or age > 100:
raise ValueError('age must between 0 ~ 100!')
self.age = age

这样写就完善很多,参数不会被随意更改了。访问age的时候需要使用p.get_age(),但这种写法不够pythonic,强大的python提供了@property方法,方法如下

class Person(object):
def __init__(self):
self._age = None
@property
def age(self):
return self._age
@age.setter
def age(self,_age):
if not isinstance(_age, int):
raise ValueError('age must be an integer!')
if _age < 0 or _age > 100:
raise ValueError('age must between 0 ~ 100!')
self._age = _age
p=Person()

这里面有一点需要注意,就是在自定义类的时候需要使用新式类,即继承了object