章节
问答
课签
笔记
评论
占位
占位

Python定义类方法

在上一节课,为了操作实例对象的私有属性,我们定义了实例方法;同样的,如果需要需要操作类的私有属性,则应该定义类的方法。
默认的,在class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。
要在class中定义类方法,需要这么写:

class Animal(object):
    __localtion = 'Asia'
    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def set_localtion(cls, localtion):
        cls.__localtion = localtion

    @classmethod
    def get_localtion(cls):
        return cls.__localtion

print(Animal.get_localtion()) # ==> Asia
Animal.set_localtion('Afica')
print(Animal.get_localtion()) # ==> Africa

和实例方法不同的是,这里有两点需要特别注意:

  1. 类方法需要使用@classmethod来标记为类方法,否则定义的还是实例方法
  2. 类方法的第一个参数将传入类本身,通常将参数名命名为 cls,上面的 cls.__localtion 实际上相当于Animal.__localtion。

       因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类的引用。

任务

如果将类属性count改为私有属性__count,则外部无法获取__count,但是可以通过一个类方法获取,请编写类方法获得__count值。

?不会了怎么办

注意类方法需要添加 @classmethod

参考答案:

class Animal(object):
    __localtion = 'Asia'
    __count = 0
    def __init__(self, name, age):
        self.name = name
        self.age = age
        Animal.__count += 1

    @classmethod
    def get_count(cls):
        return cls.__count

dog = Animal('wangwang', 1)
cat = Animal('mimi', 3)
pig = Animal('panpan', 1)
count = Animal.get_count()
print(count)
||
1
2
# Enter a code
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
提交
重置代码
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

收藏课程后,能更快找到我哦~

使用 Ctrl+D 可将课程添加到书签

邀请您关注公众号
关注后,及时获悉本课程动态

举报

0/150
提交
取消
全部 精华 我要发布

最新回答 / 英宁
第4行的__count是__init__方法里一个局部变量, 跟第2行的__count没有什么关系,并不会改变第2行的类私有属性的值。

最新回答 / 忽有狂徒夜磨刀
检查仔细行不行,你看你的print里面的Animal是不是写错了

最新回答 / 打字的狐狸
实例的属性定义函数中也不能直接调用私有的类属性,需要加一个类方法,在实例的属性定义中:class Animal(object):    __count=0    def __init__(self,name,age):        self.name=name        self.age=age        Animal.set_count()    @classmethod    def set_count(cls):        cls.__count+=1    @classmethod ...

最赞回答 / hermaniu
实例本身无count,get_count定义的是类方法,因此Leo.get_count()返回Animal的私有属性__count=0,set_count是实例方法对类无效,因此获取的__count 还是原本的0.

最赞回答 / 欧阳文轩
按照国际惯例,始于Hello World:<...code...>

最新回答 / weixin_慕桂英3100311
     def __init__(self,name,age,gender):         self.name=name         self.age=age         self.gender=gender这几行的缩进,比@classmethod的缩进多一个空格
全部 我要发布
最热 最新
只看我的

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?

账号登录 验证码登录

遇到问题
忘记密码

代码语言