All is well 3 idiots

AC小小常

【Python面向对象】(4) @property和__slots__

1. @property:将类的方法当做属性来使用,常用于对私有变量的访问方法上

class PetCat(object):
    """ 宠物猫 """

    def __init__(self, name, age):
        """
        构造方法
        :param name: 猫的姓名
        :param age: 猫的年龄
        """
        self.name = name
        self.__age = age

    # 比较常用
    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, value):
        if not isinstance(value, int):
            print("年龄只能是整数")
            return 0
        if value < 0 or value > 20:
            print("年龄只能介于0-20之间")
            return 0
        self.__age = value

    # 描述符,这样show_info方法可以作为该类的一个属性
    @property
    def show_info(self):
        """ 显示猫的信息 """
        return "我叫{0},今年{1}岁啦".format(self.name, self.__age)

    def __str__(self):
        """ 直接打印类的描述 """
        return "这是PetCat类的描述"


if __name__ == "__main__":
    cat_black = PetCat("小黑", 2)
    print(cat_black)  # 输出:这是PetCat类的描述
    print(cat_black.show_info)  # 输出:我叫小黑,今年2岁啦  注意:cat_black.show_info()不能使用
    print("--------------------")
    # 对猫的年龄进行操作
    print(cat_black.age)  # 输出:2
    cat_black.age = -1  # 输出:年龄只能介于0-20之间
    cat_black.age = "hello"  # 输出:年龄只能是整数
    cat_black.age = 5
    print(cat_black.age)  # 输出:5

 

2. __slots__:一旦设定,则类的属性与方法不可在实例后进行添加,子类也会继承该属性

  (1)为指定的类设置一个静态属性列表

  (2)为属性很少的类节约内存空间

class PetCat(object):
    """ 宠物猫 """
    # 使用后不允许给类添加新的属性和方法
    __slots__ = ("name", "age")

    def __init__(self, name, age):
        """
        构造方法
        :param name: 猫的姓名
        :param age: 猫的年龄
        """
        self.name = name
        self.age = age

    # 描述符,这样show_info方法可以作为该类的一个属性
    @property
    def show_info(self):
        """ 显示猫的信息 """
        return "我叫{0},今年{1}岁啦".format(self.name, self.age)

    def __str__(self):
        """ 直接打印类的描述 """
        return "这是PetCat类的描述"


class HuaCat(PetCat):
    # 子类继承父类也会继承__slots__,如果想要添加新的属性,需要再定义__slots__
    __slots__ = ("color",)
    pass


def eat():
    print("我喜欢吃鱼")


if __name__ == "__main__":
    cat_black = PetCat("小黑", 2)
    print(cat_black)  # 输出:这是PetCat类的描述
    print(cat_black.show_info)  # 输出:我叫小黑,今年2岁啦  注意:cat_black.show_info()不能使用
    # # 给实例添加新的属性
    # cat_black.color = "黑色"
    # print(cat_black.color)  # 输出:黑色
    # # 给实例添加新的方法
    # cat_black.eat = eat
    # cat_black.eat()  # 我喜欢吃鱼
    # # 以上说明可以对该类进行修改,类中定义了__slots__后不能修改
    cat_hua = HuaCat("小花", 3)
    print(cat_hua.show_info)  # 输出:我叫小花,今年3岁啦

 

posted on 2020-04-15 14:53  AC小小常  阅读(238)  评论(0编辑  收藏  举报

导航