Python新手:面向对象编程的难题

use*_*038 1 python oop

  1. 这两个类声明有什么区别?"对象"做什么?

    class className(object):
        pass 
    
    class className:
        pass 
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行以下代码时,为什么会出现此错误:"不带参数(给定1个)"

    class Hobbs():
        def represent():
            print "Hobbs represent!"
        represent = classmethod(represent)
    
    Hobbs.represent()   
    
    Run Code Online (Sandbox Code Playgroud)
  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()
    
    Run Code Online (Sandbox Code Playgroud)
  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()
    
    Run Code Online (Sandbox Code Playgroud)

"TypeError:unbound方法static_foo()必须使用Foo实例作为第一个参数调用(没有取而代之)"

Pet*_*bot 5

  1. 使用object作为新类的基类至少是因为Python 2.2,并且被称为"新风格类" - 请参阅此问题以获取更多详细信息.旧样式类(即:不继承的类object)设置为在Python 3.0中不推荐使用.这些更改的原因有些模糊,与低级类解析和继承模式有关.

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

    class Hobbs():
        def represent(cls):
            print "Hobbs represent!"
        represent = classmethod(represent)
    
    Hobbs.represent()   
    
    Run Code Online (Sandbox Code Playgroud)
  3. 调用Foo.class_foo()不会导致任何问题,因为Python会class_foo在您调用它时自动将类对象传递给方法.这些方法称为绑定方法 - 意味着它们是常规函数,但绑定到类或实例对象.绑定方法自动将它们绑定的类或实例对象作为其第一个参数.

  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()
    
    Run Code Online (Sandbox Code Playgroud)