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
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()
所有类函数都必须将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中,旧式类(即:不从对象继承的类)被设置为不推荐使用。这些变化的原因有些模糊,与低级类解析和继承模式有关
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就会自动将该类对象传递给该方法。这些方法称为绑定方法——这意味着它们是常规函数,但绑定到类或实例对象。绑定方法自动将绑定到的类或实例对象作为其第一个参数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中,旧式类(即:不从对象继承的类)被设置为不推荐使用。这些变化的原因有些模糊,与低级类解析和继承模式有关
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就会自动将该类对象传递给该方法。这些方法称为绑定方法——这意味着它们是常规函数,但绑定到类或实例对象。绑定方法自动将绑定到的类或实例对象作为其第一个参数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对它的具体实现
object
。如果从中继承,则有一个新样式的类。它为您提供了一些额外的功能,例如某些装饰器。如果在Python2.x中有一个裸(无继承)定义,那么就有一个旧式类。这是为了向后兼容而存在的。在Python3.x中,您还将获得一个新样式的类(因此从对象
继承是可选的)represente()
和“类方法”。因此,当调用该类对象时,它将获取该类对象作为隐式第一个参数。但这些只适用于新型类。您已尝试将其用于旧式类。所以它不会起作用您的大多数问题实际上并不是关于面向对象本身,而是Python对它的具体实现
def static_foo():
print "static method"
static_foo = staticmethod(staticfoo)
class Hobbs:
@staticmethod
def static_foo():
print "static method"