一,@property的使用
当在类中添加一个属性时,如果将属性直接暴露在外,让对象可以随意的调用,这就会让属性可以随意的更改
# property用法一
## 实例化出的对象可以随意的获取和修改 name
class Dog: def __init__(self,name): self.name = name d =Dog("藏獒") print(d.name) # 藏獒 d.name = "中华田园犬" print(d.name) # 中华田园犬
## 在类中添加方法 get_name()来获取名字,添加set_name()来写入名字(现在就不能随心所欲设置名字了)
class Dog: def set_name(self,name): if len(name) > 10: print("名字的长度超过10个字符") else: self.name = name def get_name(self): return self.name d = Dog() d.set_name("中华田园犬") print(d.get_name()) # 中华田园犬
d1 = Dog() d1.set_name("我是超级可爱的中华田园犬") # 名字的长度超过10个字符
## @property的作用就是负责将一个方法变成一个属性调用
class Dog: def __init__(self,val): self.__NAME = val # 将数据隐藏起来 @property def name(self): return self.__NAME # obj.name访问的是self.__NAME @name.setter def name(self,value): if len(value) > 10: raise TypeError('名字的长度超过10个字符') self.__NAME = value d = Dog("中华田园犬") d.name = "藏獒" # 实际转化为 set_name("藏獒") print(d.name) # 实际转化为 get_name
## 可以自定义只读属性,只定以getter方法
# 由getter方法和setter方法,为可读可写 class Dog: def __init__(self,val): self.__NAME = val @property def name(self): return self.__NAME @name.setter def name(self,value): self.__NAME = value # 只有getter方法,为只读 class Cat: def __init__(self,val): self.__NAME = val @property def name(self): return self.__NAME
## 小总结
class Test: @property def Foo(self): print("当get是运行该方法") @Foo.setter def Foo(self,value): print("当set是运行该方法") @Foo.deleter def Foo(self): print("当delete是运行该方法") t = Test() t.Foo # 当get是运行该方法 t.Foo = "abc" # 当set是运行该方法 del t.Foo # 当delete是运行该方法
# property用法二
class Test: def get_Foo(self): print("当get是运行该方法") def set_Foo(self,value): print("当set是运行该方法") def delete_Foo(self): print("当delete是运行该方法") Test_P = property(get_Foo,set_Foo,delete_Foo) t = Test() t.Test_P # 当get是运行该方法 t.Test_P = "abc" # 当set是运行该方法 del t.Test_P # 当delete是运行该方法
# property使用

class Fraction: def __init__(self): self.EndTerm = 100 # 平时分 self.Peacetime = 100 # 总分 # 获得总分 @property def fra(self): return self.EndTerm + self.Peacetime # 修改平时分 @fra.setter def fra(self,value): self.Peacetime = value # 删除平时分 @fra.deleter def fra(self): del self.Peacetime f = Fraction() print(f.fra) # 200 f.fra = 90 # 修改平时成绩 print(f.fra) # 190 del f.fra # 删除平时成绩 f.fra # 再次调用时则报错
...
二,classmethod
## 注:普通的方式,当想要执行类中的方法时,必须传入一个实例化出来的对象
class Room: def __init__(self, name, owner, width, height): self.name = name self.owner = owner self.width = width self.height = height def cal_area(self): print("我是类中的一个方法") r1 = Room("酒店", "henry", 100, 100) Room.cal_area(r1)
Room.cal_area() # 不传入对象则会报错 TypeError: cal_area() missing 1 required positional argument: 'self'
## 定义一个供类使用的方法
# 使用@classmethod
# 用于需求:当类调用自己的方法,但与实例无关时
class Room: def __init__(self, name, owner, width, height): self.name = name self.owner = owner self.width = width self.height = height @classmethod def cal_area(cls): print("我是类中的一个方法") Room.cal_area() # 我是类中的一个方法
# 可直接调用类中的方法,而无需传入参数(实例化)
...
三,staticmethod
# 静态方法
# 1:@staticmethod 类的工具包,不和类绑定也不和具体的实例绑定
# 2:不能使用类变量和实例变量,只是类的工具包
# 3:声明静态方法,类可以不用实例化就能调用改方法,也可以实例化后调用该方法
class Room: def __init__(self, name, owner, width, height): self.name = name self.owner = owner self.width = width self.height = height @staticmethod def cal_area(a, b, c): print(a) def cal_value(x): # 类一个普通的函数,毫无意义,与上方静态方法的区别 pass Room.cal_area(10, 20, 30) # 静态方法可以被类直接调用 Room.cal_value(10) # 类可以调用cal_value r1 = Room("酒店", "henry", 100, 100) r1.cal_area(10, 20, 30) # 也能调用,不与实例绑定 r1.cal_value(10) # 但实例的参数无法调用cal_value,报错
..