property

"""
需求:age = 0, 有人修改p.age=999
设置成公共属性:容易被其他人修改,自己还不知道已经修改了
设置成私有属性,外部使用不方便了.需要加设置属性和获取属性的方法

property:把以上两点合二为一了
既简单,又保证数据的正确性.
""" class Person: def __init__(self, age): """_age是被保护的属性/方法,代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入""" self._age = age @property def age(self): """将装饰的方法 当成获取属性的方式 执行当前这个方法""" return self._age @age.setter # 设置属性值 将方法和属性必须修改成一样的名字 def age(self, age): """如果需要让用户 对象.属性 的方式修改property装饰的属性, 将当前方法改为属性名 并且还需要使用 @属性名.setter对当前方法进行装饰""" if age > 255 or age < 0: print('哥们,输入的年龄暂时有点超前了') else: self._age = age @age.deleter def age(self): """如果需要让用户 对象.属性 的方式删除property装饰的属性, 将当前方法改为属性名 并且还需要使用 @属性名.deleter对当前方法进行装饰""" print('正在删除...') del self._age person = Person(18) # 如果一个方法被property所装饰,就可以直接使用函数名获取这个属性方法的功能 print(person.age) person.age = 89 print(person.age) # 就是把一个方法当做属性去使用 # del person.age person1 = Person(20) # 包装实例属性,各自独立 print(person1.age) print(person.age) """ property:将方法包装成属性 1.装饰器方式 @property:将方法装饰为一个对象的实例属性 @属性.setter:将方法装饰为一个对象的实例属性 进行设置/修改 @属性.deleter:将方法装饰为一个对象的实例属性 进行删除 以上这三种 只有新式类可以 经典类只有@property 三个方法必须同名 + 三个装饰器 2.类属性的方式: # 包装成的属性 = property(获取操作,设置操作,删除操作,'属性的描述文档') """

property类属性:

class Person:
    def __init__(self, age):
        """_age单下划线的age是代表不能直接访问的类属性<也叫保护属性/变量/方法>,需通过类提供的接口进行访问,不能用“from xxx import *”而导入"""
        # self._age = age
        # 双下划线__age需要使用obj._类__age来访问
        self.__age = age

    def get_age(self):
        """将装饰的方法 当成获取属性的方式  执行当前这个方法"""
        return self._age

    def set_age(self, age):
        """如果需要让用户  对象.属性 的方式修改property装饰的属性,  将当前方法改为属性名
        并且还需要使用 @属性名.setter对当前方法进行装饰"""
        if age > 255 or age < 0:
            print('哥们,输入的年龄暂时有点超前了')
        else:
            self._age = age

    def del_age(self):
        """如果需要让用户  对象.属性 的方式删除property装饰的属性,  将当前方法改为属性名
                并且还需要使用 @属性名.deleter对当前方法进行装饰"""
        print('正在删除...')

    # property 类属性的方式
    # 包装成的属性 = property(获取操作,设置操作,删除操作,'属性的描述文档')
    age = property(get_age, set_age, del_age, '这是一个神奇的属性,居然是方法')


person = Person(18)
print(person.__dict__)  # {'_Person__age': 18}
print(person._Person__age)  # 18
# print(person.age)
# person.age = 989
# print(person.age)
# person1 = Person(20)
# print(person1.age)
# print(person.age)
print(Person.age)  # <property object at 0x000001B7AD6A7908>
# del person.age
# print(help(person))
# print(dir(person))
# print(dir(person))
# print(person.__doc__)

"""
名字重整:
_Person__age这种方式去调__age属性
_age:
目的是:保护私有变量/私有属性
"""
posted @ 2019-12-26 09:27  砚台是黑的  阅读(497)  评论(0编辑  收藏  举报