1.5 self、cls表示
self:在类中,表示一个对象他自己、其他语言可能为this
cls: 在类里面,表示一个类他自己
使用self初始化变量,它们的作用域就是实例的作用域,而使用cls初始化的变量将类作为其作用域
1)关于self的理解
所谓的self,可以理解为自己,就是类的实例本身,代表实例对象,谁去调用代表谁,
- xiaoyi这个实例对象调用,self就代表xiaoyi()
- xiaoer这个实例对象调用,self就代表xiaoer()
一个类方法可以被实例调用,一个实例方法不能被类调用
某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,只需要传递后面的参数即可
class Man:
def __init__(self, name, face_shaoe = '方脸'):
self.face = face_shaoe
self.name = name
@classmethod
def eat(cls):
pass
print("eat")
return 'hello word'
def drink(self):
print("{}正在喝酒".format(self.name))
self.eat() #不可以,eat为类方法
#加类为了方便调用类的其他属性
xiaoyu = Man('xiaoyi')
xiaoyu.drink()
"""
xiaoyi正在喝酒
eat
"""
补充:类里面多个方法执行的机制:先读方法的def顶格代码,不进入方法内部,如:
class Man:
def __init__(self, name, face_shaoe = '方脸'):
self.face = face_shaoe
self.name = name
@classmethod
def eat(cls):
pass
print("eat")
return 'hello word'
def drink(self):
print("{}正在喝酒".format(self.name))
self.play_game()
self.eat() #不可以,eat为类方法
def play_game(self):
print("正在玩游戏")
#加到类中为了方便调用类的其他属性
xiaoyu = Man('xiaoyi')
xiaoyu.drink()
"""
xiaoyi正在喝酒
正在玩游戏
eat
"""
2) 关于cls理解
cls表示此class如下例子的Man,将cls用于类方法中,表示此方法属于类方法eat(cls),,可以调用类属性power
class Man:
power = '强'
@classmethod
def eat(cls):
pass
print("eat")
print(self.power)
return 'hello word'
xiaoyu.eat()
'NameError: name 'self' is not defined'
修改为:
class Man:
power = '强'
@classmethod
def eat(cls):
print("eat")
print(cls.power)
return 'hello word'
xiaoyu = Man()
xiaoyu.eat()
1.6 实例方法中,可不可以去定义实例属性?
不能,会报错
例子如下:
class Man:
power = '强'
@classmethod
def eat(cls):
print("eat")
return 'hello word'
def drink(self):
print("{}正在喝酒".format(self.name))
self.play_game()
self.eat() #不可以,eat为类方法
#定义实例属性
self.single = False
def play_game(self):
print("正在玩游戏")
#初始化后,报错,single属性是后天定义的
xiaoyu = Man('xiaoyi')
# print(xiaoyu.single)
"直接调用报错:AttributeError: 'Man' object has no attribute 'single'"
xiaoyu.single = True
print(xiaoyu.single) #True
#要先调用函数才会有single
xiaoyu.drink()
print(xiaoyu.single) #False