1.property动态属性

python中当我们不想暴露一个变量时,常用的方法是这样的

from datetime import date, datetime
class Student:

    def __init__(self, birthday):
        self.birthday = birthday
        self.__age = 

    def age(self):
        return datetime.now().year - self.birthday.year


stu = Student(date(year=1990, month=10, day=25))
print(stu.age())

通过stu.age()就可以获取年龄,在日常生活中,年龄就是这个人的属性,但是数据库中存储的数据是出生日期,那能不能让age向访问对象属性来进行访问呢?

from datetime import date, datetime
class Student:

    def __init__(self, birthday):
        self.birthday = birthday

+   @property
    def age(self):
        return datetime.now().year - self.birthday.year


stu = Student(date(year=1990, month=10, day=25))
print(stu.age)

通过property装饰器就可以完成,如果要设置属性值,需要用到属性名.setter装饰器

class Student:

    def __init__(self):
        self.__score = 0

    @property
    def score(self):
        return self.__score

    @score.setter
    def score(self, value):
        self.__score = value

stu = Student()

stu.score = 18
print(stu.score)

2.getattr和getattribute魔法函数

python中,类的属性没定义时,如果访问对象的属性就会抛错。

python3.7 进阶

python 一切皆对象 python 魔法函数 python 类和对象 python Mixin python 自定义序列类 python dict python 对象引用、可变性和垃圾回收 python 元类编程