我有两个问题。
>>> class One(object):
... pass
...
>>> class Two(object):
... pass
...
>>> def digest(constr):
... c = apply(constr)
... print c.__class__.__name__
... print constr.__class__.__name__
...
>>> digest(Two)
Two
type
如何创建对象'Two'? constr()或c()都不起作用;似乎apply将它变成了一种类型。
将类和实例传递给方法时会发生什么?
答案 0 :(得分:5)
类是高级对象,因此您可以像这样简单地传递它们:
def createMyClass ( myClass ):
obj = myClass()
return obj
class A ( object ):
pass
>>> x = createMyClass( A )
>>> type( x )
<class '__main__.A'>
答案 1 :(得分:1)
只是另一个例子:
def InstanceFactory(classname):
cls = globals()[classname]
return cls()
class A(object):
def start(self):
print "a.start"
class B(object):
def start(self):
print "b.start"
InstanceFactory("A").start()
InstanceFactory("B").start()
如果该类属于另一个模块:
def InstanceFactory(modulename, classname):
if '.' in modulename:
raise ValueError, "can't handle dotted modules yet"
mod = __import__(modulename)
cls = getattr(mod, classname]
return cls()
答案 2 :(得分:1)
如何创建对象'Two'? constr()或c()都不起作用;而且它 似乎申请把它变成了一个 类型。
上述评论是针对此代码做出的:
>>> def digest(constr):
... c = apply(constr)
... print c.__class__.__name__
... print constr.__class__.__name__
apply
(已弃用:请参阅@ pyfunc的答案)当然不会将类Two
转换为类型:它已经是一个。
>>> class Two(object): pass
...
>>> type(Two)
<type 'type'>
类是第一类对象:它们是type
的实例。如果你看下一个例子,这是有道理的。
>>> two = Two()
>>> type(two)
<class '__main__.Two'>
您可以看到一个类非常清楚地作为一个类型运行,因为它可以从type
返回。这是另一个例子。
>>> Three = type('Three', (Two, ), {'foo': 'bar'})
>>> type(Three)
<type 'type'>
>>> three = Three()
>>> type(three)
<class '__main__.Three'>
您可以看到type
是一个可以实例化的类。它的构造函数有三个参数:类的名称,基类的元组和包含类属性的字典。它返回一个新的type
aka类。
关于你的最后一个问题,
通过课程时会发生什么 而且是一个方法的实例?
你必须更加具体。类只是type
的实例,因此是第一类对象。询问如果我将一个类传递给一个方法会发生什么,就像问我将一个整数传递给一个方法会发生什么:它完全取决于该方法的期望。
答案 3 :(得分:0)
我很困惑。自2.3以来不适用()已弃用
我们不再需要这个了。
apply(f, args, kwds) --> f(*args, **kwds)
其他人在现代使用中被移动/被视为弃用:
只需使用:Classname()创建一个对象。