云里云空 2022-07-15 14:15 采纳率: 0%
浏览 14

python中用类名.类方法方式调用类方法,其中self参数传入类名

关于python类方法可以统改实例属性,代码如下:

class date:
    def __init__(self):
        print("date被创建")
    def cx(self,x):
        print("cx被调用")
        date.x = x
    def cs(self,s):
        print("cs被调用")
        self.s = s
dt0 = date()
dt1 = date()
dt0.cx(10)
dt0.cs(10)
print(dt0.x,dt0.s)
dt1.cx(50)
dt1.cs(50)
print(dt1.x,dt1.s)
print(dt0.x,dt0.s)
#date.s = 100
print(dt0.s,dt1.s)
date.cs(date,100)
print(dt0.s,dt1.s)
print(date.s)


输出如下:

date被创建
date被创建
cx被调用
cs被调用
10 10
cx被调用
cs被调用
50 50
50 10
10 50
cs被调用
10 50
100

问题描述:
从输出来看,执行d1.cx会将所有date实例的属性x修改(甚至没有x属性的date实例也会被赋予x属性),因为cx方法定义中是用date.x来修改x属性而不是self.x修改属性,所以任意date实例调用cx方法将统改所有已创建date实例的x属性,这点可以理解。
但是后面这段
date.cs(date,100)
它的执行就不能理解了,由后面输出可以看到,这里没有创建新的date实例,也没有统改所有date实例的s属性,但输出date.s却可以输出,也就是这段代码单独创建了了一个date.s,这里我非常不理解,这个date.s该如何解释呢?

  • 写回答

2条回答 默认 最新

  • 林地宁宁 2022-07-15 15:07
    关注

    不要把 python 的成员方法想的规范很多,其实 python 的成员方法是很宽松的,你这里其实就是用了 python 成员方法的最泛用形式。
    虽然方法 cs() 是定义在 date 类里,但是 cs() 实际上也是一个常规的函数,只不过定义在类里面作为类成员,可以当作语法糖。
    可以说,dt0.cs(10) 在 python 的实际执行中,就是相当于 date.cs(dt0, 10)。可以看到这其实就是把语法糖展开了,只不过你用 dt0.cs(10) 这样写法的时候,他会帮你把成员函数定义里的 self 自动替换为 dt0 罢了。
    而且从你这个例子可以发现,实际上 self 是什么,完全取决你给这个函数传入什么。你最后用 date.cs(date, 100),就是把 date 当作了 self,又多亏于 python 的类型几乎没有限制,所以结果就变成了给 date 增加了一个 date.s 属性罢了。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月15日

悬赏问题

  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题