在大多数帖子中,人们常说type
是一个内置函数,如果它有一个参数,如果提供了3个参数,它就是一个元类。
但在python's doc中,type
的签名是:
class type(object)
class type(name, bases, dict)
那么,这是否意味着type
是一个内置类而不是内置函数,即使它提供了一个参数?
答案 0 :(得分:2)
type
被称为“元类”,因为它是一个产生其他类(AKA类型)的类。它的行为就像一个普通的类。特别是,它具有相当于__new__
方法,在Python中看起来像这样:
class type(object):
def __new__(cls, *args):
num_args = len(args)
if num_args not in (1, 3):
raise TypeError('type() takes 1 or 3 arguments')
# type(x)
if num_args == 1:
return args[0].__class__
# type(name, bases, dict)
name, bases, attributes = args
bases = bases or (object,)
class Type(*bases):
pass
Type.__name__ = name
qualpath = Type.__qualname__.rsplit('.', 1)[0]
Type.__qualname__ = '.'.join((qualpath, name))
for name, value in attributes.items():
setattr(Type, name, value)
return Type
Class = type('Class', (), {'i': 1})
instance = Class()
print(type(instance)) # -> Class
print(instance.__class__) # -> Class
print(type(type(instance))) # -> type
print(Class.i) # -> 1
print(instance.i) # -> 1
请注意,在实例化类时,新实例的值是从__new__
返回的值。在type
的情况下,__new__
总是返回一个类型对象(AKA类)。以下是将int
扩展为使用-1
作为默认值而非0
的类的示例:
def Int__new__(cls, *args):
if not args:
return cls(-1)
return super(cls, cls).__new__(cls, *args)
Int = type('Int', (int,), {'__new__': Int__new__})
i = Int()
print(type(i)) # -> Int
print(i.__class__) # -> Int
print(type(type(i))) # -> type
print(i) # -> -1
j = Int(1)
print(j) # -> 1
要真正深入了解type
的工作原理,请查看the C code in type_new
。你可以在那里看到(向下滚动几行)type(x)
是一个特殊情况,它会立即返回x
的类型(AKA类)。执行type(name, bases, dict)
时,将调用类型创建机制。
要获得更多乐趣,请尝试以下方法:
type(object)
type(type)
isinstance(object, object)
isinstance(type, object)
type(1)
type(type(1))
答案 1 :(得分:1)
内置type
始终返回类型对象,它基本上是一个类。无论是单参数形式还是三参数形式,都是如此。在单参数情况下,返回的对象是参数的类型(类)。在三参数的情况下,返回的对象是一个新的类型对象(类)。在这两种情况下,返回的对象都可用于实例化新对象(类的实例)。
某些类可以用作元类。这是type
的三参数形式的常见用例。但是还有其他方法可以创建一个可以用作元类的类,以及用于type
的三参数形式的其他用法。
与int
没有多大区别,int
是一个返回类型为int
的对象的内置函数。 >>> x = int()
>>> x
0
>>> type(x)
<class 'int'>
也是类的名称,可用于创建新对象:
>>> y = int("A", 16)
>>> y
10
还有类型,它有多种形式:
if list == animal {
答案 2 :(得分:0)
Python中类和函数之间的区别并不像其他语言那样明显。
您可以使用函数调用语法来调用实际函数,也可以使用__call__
方法调用类的实例,甚至覆盖__new__
的类也可以像函数一样运行。
Python用于所有这些的词是 callable :您可以使用调用语法(foo()
)调用的对象,它会计算结果。
内置的type
是callable
。它可以被称为。
有时你将type
视为一个函数,它可以工作,所以你可以说它是一个函数。其他时候你把它当成一个类,所以你可以说它是一个类。实际执行情况无关紧要。
这是打字行动:if it walks like a duck, and it quacks like a duck, then it must be a duck。