【Python笔记】属性@property,零基础

私有成员

  • 1.作用:无需向类外提供的成员,可以通过私有化进行屏蔽。
  • 2.做法:命名使用双下划线开头。
  • 3.本质:障眼法,实际也可以访问。 私有成员的名称被修改为:_类名__成员名,可以通过_dict_属性或dir函数查看。
    类的私有属性
  • __private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

属性@property

公开的实例变量,缺少逻辑验证。私有的实例变量与两个公开的方法相结合,又使调用者的操作略显复杂。而属性可以将两个方法的使用方式像操作变量一样方便。
  1.定义:
       @property
        def name(self):
             return self.__name

                    @name.setter
        def name(self, name):
              self.__name = name
2.调用:
           对象.属性名 = 数据
           变量 = 对象.属性名
3.说明:
 – 通常两个公开的属性,保护一个私有的变量。
 – @property 负责读取,@属性名.setter 负责写入
 – 只写:属性名= property(None, 写入方法名)

格式:

属性

class D:
    def __init__(self,name):
        # 写入操作
        self.name = name

    # 拦截读取操作
    # 本质:创建property对象,name 存储对象地址.
    # 注意: 创建对象时,会指定读取方法
    # 相当于: name  = property(读取方法,None)
    @property
    def name(self):
        # 逻辑判断
        return self.__name

    # 拦截写入操作
    @name.setter  # 本质:name.setter(写入方法)
    def name(self,value):
        # 逻辑判断
        self.__name = value


d01 = D("张三")
d01.name = "老三"  # 写入操作
print(d01.name) # 读取操作

只读属性

class E:
    def __init__(self, a):
        self.__a = a

    # 拦截读取操作
    @property
    def a(self):
        # 逻辑判断
        return self.__a


e01 = E(100)
# e01.a = 10 # 错误
print(e01.a)

属性本质

class F:
    def __init__(self,a):
        # 写入操作
        self.a = a

    def get_a(self):
        print("读取变量喽")
        return self.__a

    def set_a(self, value):
        print("设置变量喽")
        self.__a = value

    # 拦截对变量a的读写操作
    # 创建property对象,a存储的是对象地址.
    # 注意:创建对象时,需要传递读写方法
    a = property(get_a,set_a)


f01 = F(10)
f01.a = 200 # 写入
print(f01.a) # 读取

只写属性

class G:
    def __init__(self,a):
        # 写入操作
        self.a = a

    def set_a(self, value):
        print("设置变量喽")
        self.__a = value

    # 拦截对变量a的写入操作
    a = property(None,set_a)


g01 = G(100)
g01.a = 200
# print(g01.a) # 错误
print(g01._G__a)

实例

class Wife:
    def __init__(self, name, age):
        self.name = name
        # 缺点:缺乏对象数据的封装,外界可以随意赋值.
        self.age = age


w01 = Wife("丫头", 24)
w02 = Wife("晓蒂", 86)
w02.age = 25

封装私有化后:

class Wife:
    def __init__(self, name="", age=0):
        self.name = name  # 调用 @name.setter 修饰的方法
        # 私有成员:障眼法(解释器会改变双下划线开头的变量名)
        self.age = age  # 调用 @age.setter 修饰的方法

    @property  # 拦截读取变量的操作
    def name(self):  # get_name()
        return self.__name

    @name.setter  # 拦截写入变量的操作
    def name(self, value):  # set_name()
        self.__name = value

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

    @age.setter
    def age(self, value):
        if 20 <= value <= 30:
            self.__age = value
        else:
            self.__age = 0
            print("我不要")


w01 = Wife("丫头", 24)
# 找不到双下划线开头的数据
# print(w01.__age)
# 通过下划线 + 类名 可以访问双下划线开头的数据
# print(w01._Wife02__age)
print(w01.name)
print(w01.age)

纯属个人的Python笔记,恳请各位大佬的批评指正.喜欢的记着点赞评论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值