python -- 面向对象 -- 静态方法
python -- 面向对象 -- 静态方法
面向对象高级语法部分
- 经典类vs新式类
- 静态方法、类方法、属性方法[staticmethod classmethod property]
- 类的特殊方法
- 反射
静态方法[staticmethod]
静态方法,用作类似一个单纯的函数,实例化的对象中的self不会再和他有关系,唯一的关系就是需要通过类去调用,不能独立存在。也就是说,静态方法里无法访问实例中的任何属性,
可以看做用了这样的静态方法后,类就是一种工具包。
class Human(object):
def __init__(self, name, age):
self.NAME = name
self.AGE = age
def walk(self):
print('{0} is walking alone.'. format(self.NAME))
@staticmethod
def eat(username):
print('{0} is eating some food... ...'.format(username))
obj1 = Human('Gao', 30)
obj1.walk() # Gao is walking alone.
# 以下就是静态方法的使用
obj1.eat("WTF") # WTF is eating some food... ...
类方法 [classmethod]
类方法,只能访问类变量,不能访问实例变量。 一般情况用的很少。
class Human(object):
# 定义一个类变量human_level
human_level = '10'
def __init__(self, name, age):
self.NAME = name
self.AGE = age
def walk(self):
print('{0} is walking alone.'. format(self.NAME))
@classmethod # 使用了类的方法
def eat(self):
print('{0} will eat some food... ...'.format(self.human_level))
obj1 = Human('Gao', 30)
obj1.walk() # Gao is walking alone.
# 以下就是类方法的使用
obj1.eat() # 10 will eat some food... ...
属性方法 [property]
把一个方法变成一个静态属性,不能通过加括号来调用。对用户来说是隐藏了过程。
class Human(object):
# 定义一个类变量human_level
human_level = '10'
def __init__(self, name, age):
self.NAME = name
self.AGE = age
def walk(self):
print('{0} is walking alone.'. format(self.NAME))
@property # 使用了属性方法
def eat(self):
print('{0} will eat some food... ...'.format(self.human_level))
obj1 = Human('Gao', 30)
obj1.walk() # Gao is walking alone.
# 以下就是属性方法的使用
obj1.eat # 10 will eat some food... ...
如果原本方法需要传参数,使用了属性方法就无法通过传参数来实现。
class Human(object):
# 定义一个类变量name
name = "路人甲"
def __init__(self, name, age):
self.NAME = name
self.AGE = age
# 将需要传值的属性先初始化一个值,注意使用的是内置方法,注意写法
self.__FOOD = None
def walk(self):
print('{0} is walking alone.'. format(self.NAME))
@property # 使用了属性方法,此处无法加参数
def eat(self):
# 路人甲 will eat some None... ...
print('{0} will eat some {1}... ...'.format(self.name, self.__FOOD))
# 用一下的方法,给上面的属性方法传参数
@eat.setter
def eat(self, food):
print("我要吃{0}了。".format(food))
# 将这里的food传给了内置方法的__FOOD
self.__FOOD = food
obj1 = Human('Gao', 30)
obj1.eat # 路人甲 will eat some None... ...
# 以下就是属性方法的使用,注意写法,不是在括号里加参数,而是通过给属性赋值
obj1.eat = '生菜' # 我要吃生菜了。
# 上面的代码将“生菜”传给内置方法后,属性方法就可以再次去调用这个内置方法,
# 此时再用obj1.eat的属性方法,就可以将“生菜”传入
obj1.eat # 路人甲 will eat some 生菜... ...
# 先把一个方法变成一个属性[@property],如果想给属性赋值,
# 就要在实例化的时候将赋值的对象写成内置方法,并初始化这个值[None]
# 再用赋值的[@eat.setter]的方法,将值传给对应的内置方法
由于属性方法,使用此类用法后,默认是不让删除属性方法,所以需要用[@eat.deleter]
class Human(object):
# 定义一个类变量name
name = "路人甲"
def __init__(self, name, age):
self.NAME = name
self.AGE = age
# 将需要传值的属性先初始化一个值,注意使用的是内置方法,注意写法
self.__FOOD = None
def walk(self):
print('{0} is walking alone.'. format(self.NAME))
@property # 使用了属性方法,此处无法加参数
def eat(self):
# 路人甲 will eat some None... ...
print('{0} will eat some {1}... ...'.format(self.name, self.__FOOD))
# 用一下的方法,给上面的属性方法传参数
@eat.setter
def eat(self, food):
print("我要吃{0}了。".format(food))
# 将这里的food传给了内置方法的__FOOD
self.__FOOD = food
# 由于内置方法,不允许在删除,此时在要删除的时候,就要按照以下操作
@eat.deleter
def eat(self):
del self.__FOOD
print('Deleted it yet.')
obj1 = Human('Gao', 30)
obj1.eat # 路人甲 will eat some None... ...
# 以下就是属性方法的使用,注意写法,不是在括号里加参数,而是通过给属性赋值
obj1.eat = '生菜' # 我要吃生菜了。
# 上面的代码将“生菜”传给内置方法后,属性方法就可以再次去调用这个内置方法,
# 此时再用obj1.eat的属性方法,就可以将“生菜”传入
obj1.eat # 路人甲 will eat some 生菜... ...
# 先把一个方法变成一个属性[@property],如果想给属性赋值,
# 就要在实例化的时候将赋值的对象写成内置方法,并初始化这个值[None]
# 再用赋值的[@eat.setter]的方法,将值传给对应的内置方法
del obj1.eat # Deleted it yet.
'''
以下是结果:
路人甲 will eat some None... ...
我要吃生菜了。
路人甲 will eat some 生菜... ...
Deleted it yet.
'''
以下是来自Alex的例子,说明属性方法的用途
class Flight(object):
def __init__(self,name):
self.flight_name = name
def checking_status(self):
print("checking flight %s status " % self.flight_name)
return 1
@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")
f = Flight("CA980")
f.flight_status
'''
以下是程序的结果:
checking flight CA980 status
flight is arrived...
'''
当然可以改, 不过需要通过@proerty.setter装饰器再装饰一下,此时 你需要写一个新方法, 对这个flight_status进行更改。
class Flight(object):
def __init__(self,name):
self.flight_name = name
def checking_status(self):
print("checking flight %s status " % self.flight_name)
return 1
@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):
status_dic = {
: "canceled",
:"arrived",
: "departured"
}
print("\033[31;1mHas changed the flight status to \033[0m",status_dic.get(status) )
@flight_status.deleter #删除
def flight_status(self):
print("status got removed...")
f = Flight("CA980")
f.flight_status
f.flight_status = 2 #触发@flight_status.setter
del f.flight_status #触发@flight_status.deleter

浙公网安备 33010602011771号