“类本身是对象”是什么意思?

13 投票
7 回答
1055 浏览
提问于 2025-04-16 20:18

我刚刚在看关于Python的文档,里面提到“类本身就是对象”。这和C#、Java、Ruby或者Smalltalk里的类有什么不同呢?这种类相比于其他语言有什么优缺点呢?

7 个回答

2

在C#和Java中,类并不是对象。它们是类型,这两种语言是静态类型的。没错,你可以得到一个代表特定类的对象,但这和类本身是不同的。

而在Python中,看起来像类的东西其实也是对象。

这里有个链接,解释得比我能说得更清楚,感兴趣的话可以看看:这里 :)

3

声明一个类其实就像声明一个变量一样简单:

class foo(object):
    def bar(self): pass
print foo # <class '__main__.foo'>

它们可以像任何变量一样被赋值和存储:

class foo(object):
    pass
class bar(object):
    pass
baz = bar # simple variable assignment
items = [foo, bar]
my_foo = items[0]() # creates a foo
for x in (foo, bar): # create one of each type
    print x()

也可以像变量一样被传递:

class foo(object):
    def __init__(self):
        print "created foo"
def func(f):
    f()

func(foo)

可以通过函数来创建,包括基本类列表:

def func(base_class, var):
    class cls(base_class):
        def g(self):
            print var
    return cls

class my_base(object):
    def f(self): print "hello"

new_class = func(my_base, 10)
obj = new_class()
obj.f() # hello
obj.g() # 10

相比之下,在Java中,类有对应的对象,比如说String.class,但类名本身——String——并不是一个对象,不能像对象那样去操作。这是静态类型语言的一个特点。

9

在Python中,类也是一种对象,这意味着你可以把它们赋值给变量,也可以把它们传递给函数,就像对待其他对象一样。例如:

>>> t = type(10)
>>> t
<type 'int'>
>>> len(t.__dict__)
55
>>> t() # construct an int
0
>>> t(10)
10

而在Java中,有一种叫做Class的对象,它提供了一些关于类的信息,但你不能用它来替代明确的类名。它们其实并不是真正的类,只是一些关于类的信息结构。

Class C = x.getClass();
new C(); // won't work

撰写回答