鱼C论坛

 找回密码
 立即注册
查看: 3851|回复: 3

[已解决]类和对象问题

[复制链接]
发表于 2023-1-1 22:41:50 | 显示全部楼层 |阅读模式
4鱼币
1、class C:
    count=0
    def __init__(self):
        C.count+=1
    @classmethod
    def get_count(cls):
        print(f"该类一共实例化了{cls.count}个对象")
2、class C:
    count=0
    def __init__(self):
        C.count+=1
    @classmethod
    def count(cls):
        print(f"该类一共实例化了{cls.count}个对象")
3、class C:
    count=0
    def __init__(self):
        C.count+=1
    @classmethod
    def get_a(cls):
        print(f"该类一共实例化了{cls.count}个对象")
c1=C()
c2=C()
c2.get_count()/c2.count()/c2.get_a
为什么只有第一种情况下能成功,第二种和第三种都抛出异常?@classmathod下面的函数名不是普通的函数名吗,为什么不让修改?
最佳答案
2023-1-1 22:41:51
在第二种和第三种情况中,您将类方法的名称与实例变量的名称相同,这会导致名称冲突。因此,当您尝试调用这些方法时,Python会引发一个AttributeError异常,因为它无法区分是要调用方法还是访问实例变量。

在第一种情况中,您将类方法的名称设置为get_count,而不是与实例变量名称相同,因此不会出现名称冲突,这也是为什么它能够成功运行的原因。

因此,为了避免这种名称冲突,建议在编写类方法时,将名称与类的实例变量名称区分开来,以避免这种情况的发生。

最佳答案

查看完整内容

在第二种和第三种情况中,您将类方法的名称与实例变量的名称相同,这会导致名称冲突。因此,当您尝试调用这些方法时,Python会引发一个AttributeError异常,因为它无法区分是要调用方法还是访问实例变量。 在第一种情况中,您将类方法的名称设置为get_count,而不是与实例变量名称相同,因此不会出现名称冲突,这也是为什么它能够成功运行的原因。 因此,为了避免这种名称冲突,建议在编写类方法时,将名称与类的实例变量名 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-1 22:41:51 | 显示全部楼层    本楼为最佳答案   
在第二种和第三种情况中,您将类方法的名称与实例变量的名称相同,这会导致名称冲突。因此,当您尝试调用这些方法时,Python会引发一个AttributeError异常,因为它无法区分是要调用方法还是访问实例变量。

在第一种情况中,您将类方法的名称设置为get_count,而不是与实例变量名称相同,因此不会出现名称冲突,这也是为什么它能够成功运行的原因。

因此,为了避免这种名称冲突,建议在编写类方法时,将名称与类的实例变量名称区分开来,以避免这种情况的发生。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-2 10:27:25 | 显示全部楼层
第2个 方法名和类变量同名了,把方法名改个带动词的名称。
第3个我这没有报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-17 17:54:46 | 显示全部楼层
第一种情况能够成功是因为在调用`get_count()`方法时,使用了括号将其视为一个函数来调用。而在第二种和第三种情况下,`count`和`get_a`被定义为类属性,它们实际上是类的变量,并不是用于调用的方法。因此,当您尝试调用它们时,会引发typeerror异常,因为不能像方法一样调用变量。

至于为什么不能修改`@classmethod`下面的函数名,这是由python的语法规则所确定的。使用`@classmethod`装饰器声明的函数必须使用cls作为第一个参数,表示类本身,而不能使用其他名称。然而,您可以自由地选择其他名称作为第二个参数以及后续参数。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表