Skip to content

property 动态属性

模块的导入

from datetime import date, datetime 
class User:
    def __init__(self, name, birthday):
        self.name = name
        self.birthday = birthday 

user = User("BYA", date(year=2000, month=1, day=1))
print ("in {} file" . format(__file__))

# 在另一个py文件中导入User类, 会连同 print 也一起被执行了
# 因此,在测试的时候,最好用 if '__name__' == '__main__':
from chapter07.text import User

property装饰器(属性方法)

假如一个类有年龄属性, 我们需要设置值并能获取值

  • 方法一: 在__init__()中设置 age, 但是问题是对于赋值无法添加处理或者校验
class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
stu = Student('Tom', 12)
stu.age = 20
  • 方法二: 使用 set_age 方法 和 get_age 方法
class Student:
    def __init__(self, name):
        self.name = name

    def set_age(self,age):
        if isinstance(age,int):
            if 0<age<120:
                self.age=age
        else:
            print("请输入合法的年龄")

    def get_age(self):
        return self.age

stu=Student("Jerry")
stu.age=120  #stu自己给自己添加了一个age 属性,所以不会报错。这个属性只是属于stu对象
print(stu.age)

为了让age更安全, 可以改成_age,这属于python 编码上的一种规范,并不能做到真正的隐藏。

  • property 装饰起,则实现了上面的set_age和get_age的作用
class Student:
    def __init__(self, name):
        self.name = name
        self._age = age

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

    @age.setter
    def age(self,age):
        if isinstance(age,int):
            if 0<age<120:
                self._age=age
        else:
            print("请输入合法的年龄")

stu = Student("Jerry")
stu.age=10
print(stu.age)


1. get和set的方法名称都要一样age
2. set方法返回的属性前面加个"_"
3. @property是针对get方法
4. @age.setter是针对set方法@property本身又创建了另一个装饰器
5. 直接可以这样 stu.age = 10 对象名.方法名进行赋值
6. 只定义getter方法不定义setter方法是一个只读属性

最大特点

属性值可动态获取