Why does “self” outside a function's parameters give a “not defined” error?
查看此代码:
1 2 3 4 5 6 7 8 | class MyClass(): # Why does this give me"NameError: name 'self' is not defined": mySelf = self # But this does not? def myFunction(self): mySelf2 = self |
基本上,我想要一种方法让一个类引用它自己,而不需要具体地命名它自己,因此我希望自己为这个类工作,而不仅仅是方法/函数。我怎样才能做到这一点?
编辑:这一点是,我试图从类本身内部引用类名,用self.class.u name,这样类名就不会被硬编码在类代码中的任何地方,从而更容易重用代码。
编辑2:从下面的答案中我学到了什么,我想做的是不可能的。我得换个方法。任务被放弃。
编辑3:我想做的是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class simpleObject(object): def __init__(self, request): self.request = request @view_defaults(renderer='string') class Test(simpleObject): # this line throws an error because of self myClassName = self.__class__.__name__ @view_config(route_name=myClassName) def activateTheView(self): db = self.request.db foo = 'bar' return foo |
号
请注意,当您希望类引用自身以便工作时,没有定义
在一个方法中,您总是可以使用
您可能希望在类创建之后修改类属性。这可以通过装饰师完成,也可以临时完成。元类可能更适合。但是,如果不知道你到底想做什么,就不可能说出来。
更新:这里有一些代码可以做你想做的事情。它使用一个元类
这是密码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | # This just spoofs the view_config decorator. def view_config(route=''): def dec(f): def wrapper(*args, **kwargs): print"route={0}".format(route) return f(*args, **kwargs) return wrapper return dec # Apply this decorator to methods for which you want to call view_config with # the class name. It will tag them. The metaclass will apply view_config once it # has the class name. def auto_view_config(f): f.auto_view_config = True return f class AutoViewConfigMeta(type): def __new__(mcls, name, bases, dict_): #This is called during class creation. _dict is the namespace of the class and # name is it's name. So the idea is to pull out the methods that need # view_config applied to them and manually apply them with the class name. # We'll recognize them because they will have the auto_view_config attribute # set on them by the `auto_view_config` decorator. Then use type to create # the class and return it. for item in dict_: if hasattr(dict_[item], 'auto_view_config'): method = dict_[item] del method.auto_view_config # Clean up after ourselves. # The next line is the manual form of applying a decorator. dict_[item] = view_config(route=name)(method) # Call out to type to actually create the class with the modified dict. return type.__new__(mcls, name, bases, dict_) class simpleObject(object): __metaclass__ = AutoViewConfigMeta class Test(simpleObject): @auto_view_config def activateTheView(self): foo = 'bar' print foo if __name__=='__main__': t = Test() t.activateTheView() |
如果有任何问题,请告诉我。
您希望将
python有一种"明晰优于含蓄"的设计理念。
许多语言在一个方法的范围内有一个隐式指针或变量(例如,C++中的EDCOX1〔5〕),它引用调用该方法的对象。python没有这个。在这里,所有绑定的方法都将有一个额外的第一个参数,该参数是通过它调用方法的对象。你可以称它为你想要的任何东西(EDCOX1,0)不是一个像ECDOX1,5在C++中的关键字。名称
方法
解释得太多了。我不知道有什么简单的方法可以让你做你想做的事情,而且我从来没有在Python中看到过这样的要求。你能详细说明你为什么要做这样的事吗?也许有一个假设,您正在做的,可以用另一种方式使用Python来处理。
不能在类体中引用类本身,因为在执行类体时类不存在。(如果前一句话令人困惑,那么阅读有关元类的内容将清除这一点,或者使您更加困惑。)
在实例方法中,可以使用
在类方法中,类作为第一个参数传入,很像实例是实例方法的第一个参数:
1 2 3 4 5 6 | class MyClass(object): @classmethod def foo(cls): print cls.__name__ MyClass.foo() # Should print"MyClass" |
与实例方法一样,实际类可能因继承而有所不同。
1 2 3 4 | class OtherClass(MyClass): pass OtherClass.foo() # Should print"OtherClass" |
号
如果你真的需要在
因为名称
如果您想引用类本身,而不是它的某个实例,则将其拼写为
但是(应该很明显)您不能在方法主体之外引用方法参数。在