如何在类的作用域中访问“self”?
我遇到了一个有趣的问题。
假设我们有一个类,在它的构造函数里我们传入一个布尔值(也就是真或假)。那么我该如何根据这个实例的条件或布尔值来定义类里面的方法呢?举个例子:
class X():
def __init__(self, x):
self.x = x
if self.x == true: # self is unreachable outside a method.
def trueMethod():
print "The true method was defined."
if self.x == false: # self is unreachable outside a method.
def falseMethod():
print "The false method was defined."
4 个回答
1
你可以创建一个字典,然后根据字典里的值来调用相应的函数,比如:
def __init__(self, x):
self.x = x
self.my_dict = {True : lambda *a : print "True method", False: lambda *a: print "False method"}
接着你就可以通过 self.my_dict[self.x]
来访问它。
2
你不能这样做,不过如果你想临时定义一个方法,可以使用 types.MethodType
:
from types import MethodType
def trueMethod(self):
print "The true method was defined."
def falseMethod(self):
print "The false method was defined."
class X():
def __init__(self, x):
self.x = x
if self.x:
self.trueMethod = MethodType(trueMethod, self, X)
elif not self.x:
self.falseMethod = MethodType(falseMethod, self, X)
3
不可以,因为self
指的是一个实例,而在定义类的时候还没有任何实例。
虽然有一些方法可以实现类似的效果(比如在__init__
方法中根据每个实例来重命名、添加或删除方法),但其实这样做也没有什么必要。
3
你不能这样做,但你可以定义不同名字的方法,并在特定情况下让它们可用。例如:
class X(object):
def __init__(self, flag):
if flag:
self.method = self._method
def _method(self):
print "I'm a method!"
测试一下:
>>> X(True).method()
I'm a method!
>>> X(False).method()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'X' object has no attribute 'method'