gpt4 book ai didi

Python菜鸟: Headaches with Object Oriented Programming

转载 作者:太空宇宙 更新时间:2023-11-04 08:17:06 25 4
gpt4 key购买 nike

  1. 这两个类声明有什么区别? “对象”是做什么的?

    class className(object):
    pass

    class className:
    pass
  2. 为什么我在运行以下代码时会收到此错误:“不接受任何参数(给定 1 个)”

    class Hobbs():
    def represent():
    print "Hobbs represent!"
    represent = classmethod(represent)

    Hobbs.represent()
  3. 为什么即使我没有向函数传递参数,“Foo.class_foo()”也没有报错。

    class Foo(object):
    @staticmethod
    def static_foo():
    print "static method"
    @classmethod
    def class_foo(cls):
    print "Class method. Automatically passed the class: %s" % cls
    Foo.static_foo()
    Foo.class_foo()
  4. 为什么我在运行以下代码时会出现此错误?

    class Foo(object):  
    def static_foo():
    print "static method"
    static_foo = staticmethod(static_foo)
    def class_foo(cls):
    print "Class method. Automatically passed the class: %s" % cls
    class_foo = classmethod(class_foo)
    Foo.static_foo()
    Foo.class_foo()

"TypeError: unbound method static_foo() must be called with Foo instance as first argument (got nothing instead)"

最佳答案

  1. 使用 object 作为新类的基类至少从 Python 2.2 开始就已经成为惯例,并且被称为“新式类”- 参见 this question更多细节。在 Python 3.0 中不推荐使用旧样式类(即:不从 object 继承的类)。这些变化的原因有些模糊,与低级类解析和继承模式有关。

  2. 按照惯例,Python 实例方法将 self 作为它们的第一个参数。这个参数是隐式传递的——所以如果你的方法定义没有采用self,那么解释器会提示你试图调用的方法不接受自动传递给它的参数.这对于类方法完全一样,只是它们通常采用 cls 而不是采用 self。 (只是一个命名约定。)快速修复:

    class Hobbs():
    def represent(cls):
    print "Hobbs represent!"
    represent = classmethod(represent)

    Hobbs.represent()
  3. 调用 Foo.class_foo() 不会导致任何问题,因为每当您调用它时,Python 都会自动将类对象传递给 class_foo 方法。这些方法称为绑定(bind)方法 - 这意味着它们是常规函数,但绑定(bind)到类或实例对象。绑定(bind)方法自动将它们绑定(bind)到的类或实例对象作为第一个参数。

  4. 缩进级别在 Python 中很重要。我已经尝试执行您提供的代码示例,但是 static_foo =class_foo = 行都必须在 Foo 类定义中,而不是低于它或在其他方法中。正确缩进后,代码运行良好:

    class Foo(object):
    def static_foo():
    print "static method"
    static_foo = staticmethod(static_foo)
    def class_foo(cls):
    print "Class method. Automatically passed the class: %s" % cls
    class_foo = classmethod(class_foo)
    Foo.static_foo()
    Foo.class_foo()

关于Python菜鸟: Headaches with Object Oriented Programming,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12549007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com