wangye666 发表于 2023-1-1 22:41:50

类和对象问题

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,而不是与实例变量名称相同,因此不会出现名称冲突,这也是为什么它能够成功运行的原因。

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

suchocolate 发表于 2023-1-2 10:27:25

第2个 方法名和类变量同名了,把方法名改个带动词的名称。
第3个我这没有报错。

sfqxx 发表于 2023-4-17 17:54:46

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

至于为什么不能修改`@classmethod`下面的函数名,这是由python的语法规则所确定的。使用`@classmethod`装饰器声明的函数必须使用cls作为第一个参数,表示类本身,而不能使用其他名称。然而,您可以自由地选择其他名称作为第二个参数以及后续参数。
有用请设置最佳答案
页: [1]
查看完整版本: 类和对象问题