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岁啦