当在类中添加一个属性时,如果将属性直接暴露在外,让对象可以随意的调用,这就会让属性可以随意的更改
# property用法一
## 实例化出的对象可以随意的获取和修改 name
class Dog:def __init__(self,name):self.name = named =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 = namedef get_name(self):return self.named = Dog() d.set_name("中华田园犬") print(d.get_name()) # 中华田园犬
d1 = Dog() d1.set_name("我是超级可爱的中华田园犬") # 名字的长度超过10个字符
## @property的作用就是负责将一个方法变成一个属性调用
class Dog:def __init__(self,val):self.__NAME = val # 将数据隐藏起来 @propertydef name(self):return self.__NAME # obj.name访问的是self.__NAME @name.setterdef name(self,value):if len(value) > 10:raise TypeError('名字的长度超过10个字符')self.__NAME = valued = Dog("中华田园犬") d.name = "藏獒" # 实际转化为 set_name("藏獒") print(d.name) # 实际转化为 get_name
## 可以自定义只读属性,只定以getter方法
# 由getter方法和setter方法,为可读可写 class Dog:def __init__(self,val):self.__NAME = val@propertydef name(self):return self.__NAME@name.setterdef name(self,value):self.__NAME = value # 只有getter方法,为只读 class Cat:def __init__(self,val):self.__NAME = val @propertydef name(self):return self.__NAME
## 小总结
class Test:@propertydef Foo(self):print("当get是运行该方法")@Foo.setterdef Foo(self,value):print("当set是运行该方法")@Foo.deleterdef 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 # 总分# 获得总分 @propertydef fra(self):return self.EndTerm + self.Peacetime# 修改平时分 @fra.setterdef fra(self,value):self.Peacetime = value# 删除平时分 @fra.deleterdef fra(self):del self.Peacetimef = Fraction() print(f.fra) # 200 f.fra = 90 # 修改平时成绩 print(f.fra) # 190 del f.fra # 删除平时成绩 f.fra # 再次调用时则报错
...
## 注:普通的方式,当想要执行类中的方法时,必须传入一个实例化出来的对象
class Room:def __init__(self, name, owner, width, height):self.name = nameself.owner = ownerself.width = widthself.height = heightdef 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 = nameself.owner = ownerself.width = widthself.height = height@classmethoddef cal_area(cls):print("我是类中的一个方法")Room.cal_area() # 我是类中的一个方法
# 可直接调用类中的方法,而无需传入参数(实例化)
...
# 静态方法
# 1:@staticmethod 类的工具包,不和类绑定也不和具体的实例绑定
# 2:不能使用类变量和实例变量,只是类的工具包
# 3:声明静态方法,类可以不用实例化就能调用改方法,也可以实例化后调用该方法
class Room:def __init__(self, name, owner, width, height):self.name = nameself.owner = ownerself.width = widthself.height = height@staticmethoddef cal_area(a, b, c):print(a)def cal_value(x): # 类一个普通的函数,毫无意义,与上方静态方法的区别passRoom.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,报错
..