这两个类声明有什么区别?"对象"做什么?
class className(object):
pass
class className:
pass
Run Code Online (Sandbox Code Playgroud)运行以下代码时,为什么会出现此错误:"不带参数(给定1个)"
class Hobbs():
def represent():
print "Hobbs represent!"
represent = classmethod(represent)
Hobbs.represent()
Run Code Online (Sandbox Code Playgroud)为什么"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)运行以下代码时,为什么会出现此错误?
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实例作为第一个参数调用(没有取而代之)"
使用object作为新类的基类至少是因为Python 2.2,并且被称为"新风格类" - 请参阅此问题以获取更多详细信息.旧样式类(即:不继承的类object)设置为在Python 3.0中不推荐使用.这些更改的原因有些模糊,与低级类解析和继承模式有关.
按照惯例,Python实例方法self作为它们的第一个参数.这个参数是隐式传递的 - 所以如果你的方法定义不采用self,那么解释器会抱怨你试图调用的方法不接受自动传递给它的参数.对于类方法,这种方法完全相同,而不是采用self,而是通常采用cls.(只是一个命名约定.)快速修复:
class Hobbs():
def represent(cls):
print "Hobbs represent!"
represent = classmethod(represent)
Hobbs.represent()
Run Code Online (Sandbox Code Playgroud)调用Foo.class_foo()不会导致任何问题,因为Python会class_foo在您调用它时自动将类对象传递给方法.这些方法称为绑定方法 - 意味着它们是常规函数,但绑定到类或实例对象.绑定方法自动将它们绑定的类或实例对象作为其第一个参数.
缩进级别在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)