python私有变量和@property属性

私有变量

  • 私有成员:命名使用双下划线开头。
  • ·作用:无需向类外提供的成员,可以通过私有化进行屏蔽。·做法:命名使用双下划线开头。
    ·本质:障眼法,实际也可以访问。
    私有成员的名称被修改为:_类名_成员名,可以通过_dict_属
    性或dir函数查看。
"""
    封装 -- 私有成员
        障眼法:修改了私有变量名称
            本质: __变量名  -->   _类名__变量名
"""
# 1. 私有化实例变量
# 2. 提供两个公开的读写方法

class Wife:
    def __init__(self, name="", age=0):
        self.name = name
        # self.__age = age
        self.set_age(age)

    def get_age(self):
        return self.__age

    def set_age(self, value):
        if 20 <= value <= 50:
            self.__age = value
        else:
            raise Exception("我不要")


w01 = Wife("宁宁", 25)
w02 = Wife("铁锤", 26)
w01.set_age(27)
print(w01.get_age())

w01.__age = 100
# print(w01.__age)# 私有化
print(w01.__dict__)#查看当前有的实例变量
print(w01._Wife__age)# ????

"""
    封装 -- 标准属性
        作用:保护实例变量
"""


# 1. 创建实例变量
# 2. 提供两个公开的读写方法(对self.age)
# 3. 使用@property修饰读取方法
#    使用@属性名.setter修改写入方法

class Wife:
    def __init__(self, name="", age=0):
        self.name = name
        self.age = age

    @property# 创建property对象,自动绑定下面方法(读取)
    def age(self):
        return self.__age

    @age.setter# 自动绑定下面方法(写入)
    def age(self, value):
        if 20 <= value <= 50:
            self.__age = value
        else:
            raise Exception("我不要")


w01 = Wife("宁宁", 25)
w01.age = 27
print(w01.age)
print(w01.__dict__)

"""
    封装 -- 属性
"""
# 1. 创建实例变量
# 2. 提供两个公开的读写方法
# 3. 创建类变量存储property对象

class Wife:
    def __init__(self, name="", age=0):
        self.name = name
        # self.set_age(age)
        self.age = age
    
    def get_age(self):
        return self.__age

    def set_age(self, value):
        if 20 <= value <= 50:
            self.__age = value
        else:
            raise Exception("我不要")
    # @property
    # def get_age(self):
    #     return self.__age
    # @get_age.setter
    # def age(self, value):
    #     if 20 <= value <= 50:
    #         self.__age = value
    #     else:
    #         raise Exception("我不要")

    # 类变量
    # property 作用:拦截
    age = property(get_age, set_age)


w01 = Wife("宁宁", 25)
w02 = Wife("铁锤", 26)
# w01.set_age(27)
w01.age = 27
print(w01.age)
print(w01.__dict__)

@property

  • 公开的实例变量,缺少逻辑验证。私有的实例变量与两个公开的方法相结合,又使调用者的操作略显复杂。而属性可以将两个方法的使用方式像操作变量一样方便。
  • 通常两个公开的属性(读、写),保护一个私有的变量。@property负责读取,@属性名. setter负责写入只写:属性名= property(None,写入方法名)

在这里插入图片描述
可以运行运行上面的代码体会一下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rebirth-LSS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值