静态方法,类方法和属性方法
静态方法
- 通过装饰器
@staticmethod
来让类中的方法变成静态方法 - 当name函数变为静态方法时,此时静态方法将name函数与类class之间的关联截断,之前调用类下面的方法会自动传self,如果用了staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用。
- 静态方法名义上归类管理,实际中在静态方法中无法访问类和实例中的任何属性
class test:
a='asd'
def __init__(self):
self.name='tom'
def name1(self):
print(self.name)
@staticmethod
def name2(self):
print(self.name)
test1=test()
test1.name1()
test1.name2()
#tom
#TypeError: name2() missing 1 required positional argument: 'self'
使用情境
- 取消不需要的参数传递,有利于 减少不必要的内存占用和性能消耗
- 如果在类外面写一个同样的函数来做这些事,打乱了逻辑关系,导致代码维护困难,使用静态方法。
类方法
- 引入了**@classmethod**来让类中的方法变成类方法
- 类方法只能调用类属性而不能调用实例方法
class test:
a='asd'
def __init__(self):
self.name='tom'
def name1(self):
print(self.name)
@classmethod
def name2(cla):
print(cla.a)
@classmethod
def name3(self):
print(self.name)
test1=test()
test1.name1()
test1.name2()
test1.name3()
#tom
#asd
#AttributeError: type object 'test' has no attribute 'name'
属性方法
-
引入了**@property**来让类中的方法变成属性方法
-
属性方法是把一个方法变为静态属性,调用时不能有(),否则会报错
-
如下面这样,通过属性方法返回类的某个私有属性的话,只可以获得该属性的值,从而防止外部对该属性的修改以此提高了安全性
class test:
a='asd'
def __init__(self):
self.__name='tom'
@property
def name3(self): #此时test.name3 已经是test类内的一个属性
return self.__name
test1=test()
print(test1.__name3)
print(test1.name3())
#tom
#TypeError: 'str' object is not callable
关于property类
- 通过property类传入了某个私有对象的操作方法之后,生成新的共有属性,外部可以通过该共有属性对私有属性进行操作
class test:
a='asd'
def __init__(self):
self.__name='tom'
def getname(self):
return self.__name
def setname(self,name):
self.__name=name
name = property(getname,setname)
test1=test()
test1.name='asd'
print(test1.name)
#asd
注意:
1.使用@property装饰时,只能装饰获取属性的方法
2.@property装饰属性时,set/get方法不需要在属性名前加set和get,直接写属性名即可
3.如果一个属性有set/get方法存在,那么要先实现@property对获取方法的定义,再实现设置方法的定义,定义set方法时使用 @xxx.setter装饰,xxx要和获取方法名保持一致。如:上面的person获取方法被@property装饰,person设置方法被 @person.setter装饰
class test:
a='asd'
def __init__(self):
self.name='tom'
@property
def name3(self):
return self.name
@name3.setter
def name3(self, name):
self.name=name
test1=test()
print(test1.name3)
test1.name3="tom2"
print(test1.name3)
#tom
#tom2