zoukankan      html  css  js  c++  java
  • 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:
    目的是:保护私有变量/私有属性
    """
  • 相关阅读:
    分布式缓存技术之Redis_03分布式redis
    Spring 二、400行代码手写初体验Spring V1.0版本
    Spring 一、各级架构与依赖关系
    Java正则表达式基础学习
    JAVA开发:SpringBoot多数据源配置
    Spring 单例模式实现源码分析
    Spring 使用的设计模式用哪些
    Spring之@Autowired和@Resource
    Spring的优缺点
    MySQL支持的事物隔离级别以及悲观锁和乐观锁原理和应用场景
  • 原文地址:https://www.cnblogs.com/huaibin/p/12100325.html
Copyright © 2011-2022 走看看