Skip to main content
 首页 » 编程设计

Python菜鸟: Headaches with Object Oriented Programming

2025年05月04日18lautakyan007

  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()