Python对象是否源自公共父类?

时间:2015-09-07 21:27:23

标签: python python-2.7 oop python-3.x

Python中的所有东西都是一个对象,几乎所有东西都有属性和方法。现在,根据面向对象编程,在Python中创建的每个对象都必须是公共父类的实例。但是,这种逻辑对我来说没有意义。

有人可以为我清楚吗?

5 个答案:

答案 0 :(得分:4)

  

根据面向对象编程,在Python中创建的每个对象都必须是公共父类的实例

不正确。事实上,在Objective-C,Java(也可能是C#?)中,事物倾向于从单个超类派生,但这是一个实现细节 - 而不是OO设计的基础。

OO设计只需要一个足够通用的方法来查找您希望在要调用它的对象上调用的方法的实现。这通常是语言工作原理的基础(C ++,C#,Java,Objective-C,Python等都以他们自己的方式对他们的语言有意义)。

在C ++中,链接器对静态类型和向量表对动态类型(通过虚拟继承)进行此操作 - 不需要公共基类。

在Objective-C中,这是通过在对象的类结构中的哈希映射中查找某些内容,然后调用特定方法来获取所需方法的签名来完成的。这段代码细致入微,所以一切都来自一个共同的基类。

Python在技术上不应该要求这样做,但我认为他们已经做了一个实现选择来使一切都成为一个类,每个类都来自一个公共基类。

答案 1 :(得分:1)

在Python中,所有派生自类type

这就是为什么,在创建元类时,我们将type

子类化
class Meta(type):
    def __new__(cls, name, bases, attrs):
        <logic here>

class Foo(object):
    __metaclass__ = Meta

此外:

type(object) -> type
type(type) -> type

DynamicClass = type('DynamicClass', (Foo,), {'a': 1, 'b':2})

dyn = DynamicClass()
type(dyn) -> Foo

等等

答案 2 :(得分:0)

那么,

li = [1, 2, 3, 4]

class A:
  def __init__(self):
    pass

a = A()

print isinstance(a, object)
print isinstance(li, object)
print isinstance(5, object)

>> True
>> True
>> True

答案 3 :(得分:0)

在我生活的某些时刻,当我对此感到困惑时,以下简短的教程帮助了我:

python objects and types

但如果你的困惑比这更基本,那么也许你想澄清哪些部分“一切都是对象”你遇到了麻烦。

答案 4 :(得分:0)

Python中的公共父类是对象。事实上,虽然在某些版本中它不是强制性的,但您应该总是声明这样的类:

class MyClass(object):
  ...