python面向对象之数据的封装及对象属性的扩展

为了让定义的数据类型,能使用不同的应用场景,一般情况下我们 要对当前类型的所有属性进行封装处理。

封装属性之后,会提供访问属性数据的set/get方法,书写过程中方法中不需要添加任何限制条件,只是预留了可以添加限制条件的方法而已,后期根据项目需求进行限制和条件的完善。

class Goods:

    def __init__(self, name, price):
        self.__name = name
        self.__price = price

    def set_name(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_price(self, price):
        self.__price = price

    def get_price(self):
        return self.__price

car = Goods("奥拓", 18000)
print("car的价格:", car.get_price())  # 1800

# 如果通过 对象的引用变量.属性 直接赋值,该属性又不是类型中定义的属性
# 这个属性就是 单独属于这个对象 的扩展属性。
car.__price = 20000
print("car的价格", car.__price, "---", car.get_price())  # 20000 ————18000

# 扩展属性,属于对象car
car.__color = "红色"
print(car.__color)  # 红色

# car2 = Goods("奥迪", 300000)  # 报错
# print(car2.__color) 

"""
上面方法可以扩展属性,但是,这样的扩展方式,破坏了原有的封装语法,让代码的可读性出现了严重的下降

解决方案如下:在类型中,定义好~该对象可能出现的属性,其他任何扩展属性就不能添加了。
"""

class Pet:
    """宠物类型:限制该类型只能出现哪些属性"""
    # 限制该类型的对象,只能拥有下面列表中出现的属性
    __slots__ = ['__name', '__age', '__gender', 'color']

    def __init__(self, name, age):
        self.__name = name
        self.__age = age
        self.__gender = gender

    def set_name(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_age(self, age):
        self.__age = age

    def get_age(self):
        return self.__age

p = Pet("tomcat", 3) 
print(p.get_name(), p.get_age()) # tomcat 18 

# 扩展属性
p.color = "灰色"
print(p.get_name(), p.get_age(), p.color)

p.email = "tomcat@cat.com"  # 报错
print(p.email)


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值