property、classmethod和staticmethod总结

我们知道只要在类内部定义的,并且没有被任何装饰球修饰过的方法,都是绑定到对象的绑定方法。实例化的对象调用绑定方法时,会把对象作为第一个参数self自动传入。

 1 class People:
 2     def __init__(self,name,age):
 3         self.name = name
 4         self.age = age
 5     def walk(self):#绑定到对象的方法 
 6         print("%s is walking"%self.name)
 7     def say(self):#绑定到对象的方法 
 8         print("%s is walking"%self.name)
 9 
10 f = People("Grace",18)
11 f.walk()
12 f.say()
13 print(f.walk)

 

@classmethod

这是绑定到类的方法,专门给类调用。调用方式:类名.绑定到类的方法(),把类名作为第一个参数cls传入。

 1 class Solider:
 2     def __init__(self,level,coutry):
 3         self.level = level
 4         self.coutry = coutry
 5 
 6     @classmethod
 7     def US_solider(cls): #绑定到类的方法
 8         "大规模产生A等级美国士兵对象"
 9         US_A = Solider("A_level","USA")
10         return US_A
11 
12     def attack(self):
13         print("%s soilder start to attack"%self.coutry)
14 
15 us1 = Solider.US_solider()
16 print(us1.coutry)
17 print(us1.__dict__)
18 print(Solider.US_solider) #绑定到类的方法
19 print(us1.attack)#绑定到对象的方法

@staticmethod

类里面定义的函数属性,除了绑定到对象、绑定到类,还可以通过@staticmethod解除绑定。这个函数则类似普通函数,相当于一个工具包。这样就没有自动传值的功能了。

 1 lass Weather:
 2     def __init__(self,air,wet,temperature):
 3         self.air = air
 4         self.wet = wet
 5         self.temperature = temperature
 6     @staticmethod
 7     def nomal_spring():
 8         print("the nomal spring wether:sunshine,the wet: 40,the temperature:15")
 9 
10 
11 bj1 = Weather("sunshine",30,18)
12 bj1.nomal_spring() #对象可以调用
13 Weather.nomal_spring()#类也可以调用

 

@property

property是一种特殊的属性。
它的作用:
1、实例化对象调用方法时,不需要额外添加()进行调用方法
2、遵循了"统一访问原则",避免使用方法时产生混乱。
@property,还可以封装属性,配合setter、deleter,对属性的查找、修改、删除进行自定义。

 1 class Foo:
 2     def __init__(self,name):
 3         self.__name = name
 4     @property
 5     def name(self):
 6         return self.__name
 7     @name.setter
 8     def name(self,value):
 9         self.__name = value
10 
11     @name.deleter
12     def name(self):
13         del self.__name
14 
15 
16 f = Foo("maple")
17 f.name = "allen"
18 print(f.name)
19 print(Foo.name(f))

 

posted @ 2017-04-24 15:19  Great_kyle  阅读(300)  评论(0编辑  收藏  举报