我有一个类,试图根据传递给它的变量名实例化另一个类。它抱怨'str'对象不可调用。这样做的正确方法是什么?
def MyClass:
def __init__(self, otherName):
self.other = otherName()
编辑:这是我的全部代码,有什么我应该做的不同吗? Python中的eval是邪恶的吗?
#!/usr/bin/python
class Model:
def get_post(self, id):
# Would query database, perhaps
return {"title": "Python :: Test Page", "body": "Test page using Python!"}
class Controller:
def __init__(self, viewName):
self.model = Model()
self.view = viewName()
def main(self):
post = self.model.get_post(1)
self.view.display(post)
class View:
def header(self, item):
print "Content-type: text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>%(title)s</title>" % item
print "</head>"
print "<body>"
def footer(self, item):
print "</body>"
print "</html>"
class Blog(View):
def display(self,item):
View.header(self,item)
print "<p>%(body)s</p>" % item
View.footer(self,item)
c = Controller(Blog)
c.main()
答案 0 :(得分:9)
你可以在没有的情况下使用字符串。您可以按名称引用Python中的类,并像其他任何对象一样传递它们。因此,使用上面MyClass
的定义,而不是:
c = Controller("Blog")
你可以简单地使用:
c = Controller(Blog)
绝对不建议使用eval()
这样的东西。
答案 1 :(得分:0)
你应该能够通过locals()函数返回的字典进入你的班级。这是一个简单的类,
class ClassA:
def __init__(self, word):
self.word = word
def __str__(self):
return "Class A word is '%s'" % self.word
我可以从其名称字符串创建此类,并正常调用它,
>>> myclass = locals()['ClassA']('wibble')
>>> print myclass
Class A word is 'wibble'
答案 2 :(得分:-1)
如果您真的想将参数作为字符串传递,可以使用eval()。
class MyClass:
def __init(self, otherName):
self.other = eval(otherName)()