私有化与property属性

私有化

  • xx: 公有变量
  • _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
  • __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
  • __xx__:双前后下划线,用户名字空间的魔法对象或属性。例如: __init__ , 不要自己发明这样的名字
  • xx_:单后置下划线,用于避免与Python关键词的冲突

Python基础day_02中的伪私有属性和私有方法

总结

  • 父类中属性名为__名字的,子类不继承,子类不能访问
  • 如果在子类中向 __名字 赋值,那么会在子类中定义的一个与父类相同名字的属性
  • _名字 的变量、函数、类在使用from xxx import *时都不会被导入

属性property

私有属性添加getter和setter方法

class Money(object):
    def __init__(self):
    self.__money = 0

    def getMoney(self):
        return self.__money

    def setMoney(self, value):
        if isinstance(value, int):
            self.__money = value
        else:
            print("error:不是整型数字")

使用property升级getter和setter方法

class Money(object):
    def __init__(self):
    self.__money = 0

    def getMoney(self):
        return self.__money

    def setMoney(self, value):
        if isinstance(value, int):
            self.__money = value
        else:
            print("error:不是整型数字")
    money = property(getMoney, setMoney)

使用property取代getter和setter方法

@property成为属性函数。可以对属性赋值时作必要的检查,并且保证代码的清晰短小

  • 将方法转换为只读
  • 重新实现一个属性的设置和读取方法,可做边界判定
class Money(object):
    def __init__(self):
        self.__money = 0
    @property
    def money(self):
        return self.__money

    @money.setter
    def money(self, value):
        if isinstance(value, int):
            self.__money = value
        else:
            print("error:不是整型数字")

这样访问是就可以直接使用对象.属性的方式访问,但是本质还是去调用方法!

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/81459297