我发现以下两项工作:
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
所有Python类都应该扩展对象吗?不扩展对象是否存在任何潜在问题?
我发现以下两项工作:
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
所有Python类都应该扩展对象吗?不扩展对象是否存在任何潜在问题?
Answers:
在Python 2中,不继承自object
将创建一个旧式类,除其他效果外,该类还会导致type
产生不同的结果:
>>> class Foo: pass
...
>>> type(Foo())
<type 'instance'>
与
>>> class Bar(object): pass
...
>>> type(Bar())
<class '__main__.Bar'>
多重继承的规则也不同在这里我什至不尝试总结。我所见过的有关MI的所有好的文档都描述了新型类。
最终,旧式类在Python 3中消失了,并且继承自object
隐式了。因此,除非您需要与旧软件向后兼容,否则请始终偏爱新样式类。
在Python 3中,object
无论您是否自己说,类都隐式扩展。
在Python 2中,有旧式和新式类。要发出新的类信号,您必须显式继承自object
。如果不是,则使用旧式实现。
通常,您需要一个新式的类。object
显式继承。请注意,这也适用于旨在与Python 2兼容的Python 3代码。
在python 3中,您可以通过三种不同的方式创建一个类,并且在内部它们都相等(请参见示例)。创建类无关紧要,Python 3中的所有类都继承自称为object的特殊类 。类对象 是python中的基础类,并提供许多功能,例如双下划线方法,描述符,super()方法,property()方法等。
范例1。
class MyClass:
pass
示例2
class MyClass():
pass
范例3。
class MyClass(object):
pass
object
引用了Built -in object
。如果必须考虑到可以替换任何CPython的内置标识符,我们几乎不能对数据模型进行断言。可以严肃地争论一下,str
因为有人可以赋值,所以并不总是接受字符串作为参数builtins.str = None
吗?
是的,所有Python类都应扩展(或更确切地说是子类,这里是Python)对象。尽管通常不会发生严重的问题,但在某些情况下(如具有多个继承树),这将很重要。这也确保了与Python 3的更好兼容性。
正如其他答案所涵盖的那样,从对象继承Python 3是隐式的。但是他们没有说明您应该做什么以及什么是惯例。
Python 3文档示例全部使用以下约定的样式,因此,我建议您在以后使用Python 3的任何代码中都遵循此样式。
class Foo:
pass
资料来源:https : //docs.python.org/3/tutorial/classes.html#class-objects
引用示例:
类对象支持两种操作:属性引用和实例化。
属性引用使用Python中所有属性引用使用的标准语法:obj.name。有效属性名称是创建类对象时在类名称空间中的所有名称。因此,如果类定义如下所示:
class MyClass: """A simple example class""" i = 12345 def f(self): return 'hello world'
另一句话:
一般来说,实例变量用于每个实例唯一的数据,类变量用于类的所有实例共享的属性和方法:
class Dog: kind = 'canine' # class variable shared by all instances def __init__(self, name): self.name = name # instance variable unique to each instance
在python3中没有区别,但是在python2中不扩展object
给您带来了老式的类;您想在旧类上使用新类。
class Foo():
和class Foo:
?正如我所观察到的,它们都可以在Python 3中工作