python基础语法 010 类和对象- 5 self、cls

 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

 

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值