Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python新手:面向对象编程的难题_Python_Oop - Fatal编程技术网

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

Python新手:面向对象编程的难题,python,oop,Python,Oop,这两个类声明之间有什么区别?“对象”是做什么的 为什么在运行以下代码时会出现此错误:“不接受任何参数(给定1)” 为什么“Foo.class_Foo()”即使我没有向函数传递参数,也没有给出错误 class Foo(object): @staticmethod def static_foo(): print "static method" @classmethod def class_foo(cls): print "Class met

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

  • 为什么在运行以下代码时会出现此错误:“不接受任何参数(给定1)”

  • 为什么“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()
    
  • 为什么在运行下面的代码时会出现此错误

    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:必须使用foo调用未绑定的方法static_foo() 实例作为第一个参数(没有得到任何结果)


    所有类函数都必须将self作为第一个参数

    class  A:
       def my_func(self):
            print "In my func"
    
    静态方法是类,它们几乎只是名称空间中的一个函数(在python中很少使用)


    类方法是类命名空间中的函数,应在类本身而不是实例上调用这些函数

    所有类函数都必须将self作为第一个参数

    class  A:
       def my_func(self):
            print "In my func"
    
    静态方法是类,它们几乎只是名称空间中的一个函数(在python中很少使用)

    类方法是类命名空间中的函数,应该在类本身而不是实例上调用

  • 使用
    object
    作为新类的基类,至少从Python 2.2开始就已成为惯例,称为“新样式类”-有关详细信息,请参阅。在Python 3.0中,旧式类(即:不从
    对象继承的类)被设置为不推荐使用。这些变化的原因有些模糊,与低级类解析和继承模式有关

  • 按照惯例,Python实例方法将
    self
    作为它们的第一个参数。此参数是隐式传递的-因此,如果您的方法定义不接受
    self
    ,那么解释器将抱怨您尝试调用的方法不接受自动传递给它的参数。这与classmethods的工作原理完全相同,只是它们通常采用
    cls
    而不是
    self
    。(只是一个命名约定。)快速修复:

    class Hobbs():
        def represent(cls):
            print "Hobbs represent!"
        represent = classmethod(represent)
    
    Hobbs.represent()   
    
  • 调用
    Foo.class\u Foo()
    不会引起任何问题,因为只要调用
    class\u Foo
    方法,Python就会自动将该类对象传递给该方法。这些方法称为绑定方法——这意味着它们是常规函数,但绑定到类或实例对象。绑定方法自动将绑定到的类或实例对象作为其第一个参数

  • 缩进级别在Python中很重要。我已经尝试执行您提供的代码示例,但是
    static\u foo=
    class\u 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()
    
  • 使用
    object
    作为新类的基类,至少从Python 2.2开始就已成为惯例,称为“新样式类”-有关详细信息,请参阅。在Python 3.0中,旧式类(即:不从
    对象继承的类)被设置为不推荐使用。这些变化的原因有些模糊,与低级类解析和继承模式有关

  • 按照惯例,Python实例方法将
    self
    作为它们的第一个参数。此参数是隐式传递的-因此,如果您的方法定义不接受
    self
    ,那么解释器将抱怨您尝试调用的方法不接受自动传递给它的参数。这与classmethods的工作原理完全相同,只是它们通常采用
    cls
    而不是
    self
    。(只是一个命名约定。)快速修复:

    class Hobbs():
        def represent(cls):
            print "Hobbs represent!"
        represent = classmethod(represent)
    
    Hobbs.represent()   
    
  • 调用
    Foo.class\u Foo()
    不会引起任何问题,因为只要调用
    class\u Foo
    方法,Python就会自动将该类对象传递给该方法。这些方法称为绑定方法——这意味着它们是常规函数,但绑定到类或实例对象。绑定方法自动将绑定到的类或实例对象作为其第一个参数

  • 缩进级别在Python中很重要。我已经尝试执行您提供的代码示例,但是
    static\u foo=
    class\u 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对它的具体实现

  • Python2.x经历了一些演变,添加了一些新特性。因此,有两种方法来定义类,即“新样式类”和“旧样式类”。Python3.x只有“新样式类”。 新样式类的基对象称为
    object
    。如果从中继承,则有一个新样式的类。它为您提供了一些额外的功能,例如某些装饰器。如果在Python2.x中有一个裸(无继承)定义,那么就有一个旧式类。这是为了向后兼容而存在的。在Python3.x中,您还将获得一个新样式的类(因此从
    对象
    继承是可选的)

  • 您已经创建了
    represente()
    和“类方法”。因此,当调用该类对象时,它将获取该类对象作为隐式第一个参数。但这些只适用于新型类。您已尝试将其用于旧式类。所以它不会起作用

  • Python自动将类对象作为类方法的参数0插入。所以这是正确的模式,它是有效的

  • 该方法不知何故没有生成类方法,可能是因为缩进错误


  • 您的大多数问题实际上并不是关于面向对象本身,而是Python对它的具体实现

  • Python2.x经历了som
    def static_foo():
        print "static method"
        static_foo = staticmethod(staticfoo)    
    
     class Hobbs:
        @staticmethod
        def static_foo():
             print "static method"