该部分的三个属性都是高级方法,平时用的地方不是很多
一、静态方法
静态方法的使用不是很多,可以理解的就看一下,用的地方不是很多
class Dog(object):
def __init__(self,name):
self.name = name
# 静态方法:平时用的不是很多,可以通过联想中国和*的关系来记忆
# 只是名义上归类管理,实际上在静态方法中访问不了类或实例中的任何属性
@staticmethod # 变成静态方法之后该方法就和类没什么关系了,就只是相当于一个单纯的函数,
def eat(self): # 并且没法使用类里面的变量了,但是可以使用自己的变量
# def eat(self, food):
# print("%s is eating %s..."%(self.name,food))
print("%s is eating %s..." % ("ddd", "sss"))
d = Dog("zhangsan")
d.eat("baozi")
二、类方法
和静态方法一样,用的地方不是很多
class Dog(object):
n = "ddd" # 类变量
def __init__(self,name):
self.name = name
# 类方法:无论实例变量怎么改,都是依据类变量来变化和静态方法一样 基本用不到
@classmethod # 类方法只能访问类变量,不能访问实例变量
def eat(self,food): # 实例变量
print("%s is eating %s..."%(self.n,food))
d = Dog("zhangsan") # 因为类方法只能访问类变量,所以无论该参数是什么,结果都是'ddd'
d.eat("baozi")
三、属性方法
属性方法的使用有实例,但是用的地方也不是很多
class Dog(object):
def __init__(self,name):
self.name = name
self.__food = None
# 属性方法: 把一个方法变成一个静态属性,就不能再调用了
# 隐藏了方法,对用户来说就是提供了一个API,实现就一步
@property
def eat(self): # 实例变量
print("%s is eating %s..."%(self.name,self.__food))
@eat.setter # 如果想使属性变量可以传参数(修改属性),可以这么设置
def eat(self,food):
print("set to food:",food)
self.__food = food
@eat.deleter # 可以通过此方法删掉属性
def eat(self):
del self.__food
print("删完了")
d = Dog("zhansgan")
# d.eat() # 这是不行的,因为静态方法变成属性之后就不能在调用了
d.eat # 只能以方法的形式来调用,就不能传参数了
del d.eat # 如果不通过@eat.deleter,这个操作是没用的
d.eat # 报错之后说明属性通过@eat.deleter得到了删除
属性方法的使用可以结合下面的实例来理解:
class Flight(object):
def __init__(self,name):
self.flight_name = name
def checking_status(self):
print("checking flight %s status " % self.flight_name)
return 0
@property
def flight_status(self):
status = self.checking_status()
if status == 0 :
print("flight got canceled...")
elif status == 1 :
print("flight is arrived...")
elif status == 2:
print("flight has departured already...")
else:
print("cannot confirm the flight status...,please check later")
@flight_status.setter
def flight_status(self,status):
print("flight %s has changed status to %s" %(self.flight_name,status))
f = Flight("CA980")
f.flight_status
f.flight_status = 2
福利:
1.在网上浏览到的关于几种方法更好的解释详情请见:https://www.cnblogs.com/wcwnina/p/8644892.html
2.不能获得的,这个和变量的生命周期有关,一个方法中的一个变量的生命周期是从它在这个方法中声明开始,到这个方法调用完毕时结束。
因此你在类A中的方法a中无法调用类B中的方法b中的变量var_b,因为这个变量在这个时间还没有被创建。