静态方法、类方法、属性方法
一、静态方法
1、定义
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。在方法名前加上@staticmethod装饰器,表示此方法为静态方法
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod #在方法前加上staticmethod 装饰器定义静态方法
def eat():
print("the dog like eat bone")
2、静态方法特性
特性:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性
(1)静态方法不可以传入self参数,如果想传调用时必须传入实例本身
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod #在方法前加上staticmethod 装饰器定义静态方法
def eat(self,food): #可以定义,但是需传入实例本身
print("{0} like eat {1}".format(self.name,food))
d=Dog("Mike")
d.eat(d,"bone")#传入实例d本身,否则会报错
# 结果
Mike like eat bone
(2)静态方法可以用类直接调用,直接调用时,不可以直接传入self,否则会报错
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod #在方法前加上staticmethod 装饰器定义静态方法
def eat(food):
print("Mike like eat {0}".format(food))
Dog.eat("bone")
#结果
Mike like eat bone
(3)应用场景
一般情况下我们需要使用工具包的一些个类的封装,可以用静态方法,比如os模块
import os os.system() os.mkdir()
上面两个方法没有什么必然的联系在里面,所以可以这么用
二、类方法
1、定义
在方法名前加上@classmethod装饰器,表示此方法为类方法
class Dog(object):
name="Mike"
def __init__(self,name):
self.name = name
@classmethod #定义类方法
def eat(self,food):
print("{0} like eat {0}".format(self.name,food))
2、类方法特性
特性:只能访问类变量(又叫静态属性),不能访问实例变量
(1)访问实例变量
class Dog(object):
def __init__(self,name):
self.name = name
@classmethod #定义类方法
def eat(self,food):
print("{0} like eat {1}".format(self.name,food))
d=Dog("Mike")
d.eat("bone")
#结果
Traceback (most recent call last):
File "/Users/bianbian/PycharmProjects/test/ha.py", line 9, in <module>
d.eat("bone")
File "/Users/bianbian/PycharmProjects/test/ha.py", line 6, in eat
print("{0} like eat {1}".format(self.name,food))
AttributeError: type object 'Dog' has no attribute 'name'
(2)访问类变量(又叫静态属性)
class Dog(object):
name = "Coco"
def __init__(self,name):
self.name = name
@classmethod #定义类方法
def eat(self,food):
print("{0} like eat {1}".format(self.name,food))
d=Dog("Mike")
d.eat("bone")
#结果
Coco like eat bone
三、属性方法
1、定义
在方法名前加上@property装饰器,表示此方法为属性方法
class Dog(object):
def __init__(self,name):
self.name = name
@property #定义属性方法
def eat(self):
return self.name
d = Dog("Mike")
print(d.eat)
#结果
Mike
2、特性
class Dog(object):
def __init__(self,name):
self.name = name
@property #定义属性方法
def eat(self):
print("{0} is eating".format(self.name))
d = Dog("Mike")
d.eat #把方法变成静态属性调用
#结果
Mike is eating
如何传入参数??
(1)给转换后的静态属性赋值
用@静态方法名.setter去装饰方法,来给转换后的静态属性赋值
class Dog(object):
def __init__(self,name):
self.name = name
@property #定义属性方法
def eat(self):
print("{0} is eating {1}".format(self.name,"bone"))
@eat.setter
def eat(self,food):
print("set food:",food)
d = Dog("Mike")
d.eat="hotdog" #给转成的静态变量赋值
d.eat
#结果
set food: hotdog
Mike is eating bone #并没有把设置的food传给eat
上述方法不可行
class Dog(object):
def __init__(self,name):
self.name = name
self.__food = None
@property #定义属性方法
def eat(self):
print("{0} is eating {1}".format(self.name,self.__food))
@eat.setter
def eat(self,food):
print("set food:",food)
self.__food = food
d = Dog("Mike")
d.eat #第一次赋值的是None
d.eat = "hotdog" #给转成的静态变量赋值
d.eat #第二次赋值是hotdog
#结果
Mike is eating None
set food: hotdog
Mike is eating hotdog
(2)删除转变的静态属性
用@静态方法名.deleter去装饰,表明可以删除转化后的静态属性
class Dog(object):
def __init__(self,name):
self.name = name
self.__food = None
@property #定义属性方法
def eat(self):
print("{0} is eating {1}".format(self.name,self.__food))
@eat.setter
def eat(self,food):
print("set food:",food)
self.__food = food
@eat.deleter #定义可以删除eat这个静态属性
def eat(self):
del self.__food
print("food变量删除完毕")
d = Dog("Mike")
d.eat #第一次赋值的是None
d.eat = "hotdog" #给转成的静态变量赋值
d.eat #第二次赋值是hotdog
del d.eat
#结果
Mike is eating None
set food: hotdog
Mike is eating hotdog
food变量删除完毕
3、练习
想知道一个火车车次当前的状态,是到达了、晚点了、取消了、还是已经开走了,需要做下面几件事:
(1) 连接12306的API查询
(2)对查询结果进行解析
(3)返回结果给用户
火车的status属性的值是一系列动作后才得到的结果,所以每次调用时,其实都要经过一系列的动作才返回结果,但这些动作过程不需要用户关心, 用户只需要调用这个属性就可以
class Train(object):
def __init__(self,name):
self.train_name = name
def checking_status(self):
print("Checking the train is %s" %self.train_name)
return 1
@property
def train_status(self):
status = self.checking_status()
if status == 0:
print("The train has canceled")
elif status == 1:
print("The train has arrived")
elif status == 2:
print("The train has drived away")
else:
print("Sorry,cannot confirm the train status,please check later")
@train_status.setter
def train_status(self,status):
status_dic={
0:"canceled",
1:"arrived",
2:"drived away"
}
print("\033[31;1mHas changed the flight status to \033[0m",status_dic.get(status))
@train_status.deleter
def train_status(self):
print("The status has been removed")
T = Train("D007")
T.train_status
T.train_status = 2
del T.train_status
结果
Checking the train is D007
The train has arrived
Has changed the flight status to drived away
The status has been removed
四、总结
- 静态方法访问不了类或实例中的任何属性,它已经脱离了类,一般会用在一些工具包中
- 类方法,只能访问类变量,不能访问实例变量
- 属性方法是把一个方法变成一个静态属性
更多精彩

