来自变量的类

时间:2010-12-30 22:10:54

标签: python class object new-operator

我有一个类,试图根据传递给它的变量名实例化另一个类。它抱怨'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()

3 个答案:

答案 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)()