我遇到了一个有趣的问题。
假设我们有一个类,在它的构造函数中我们将一个布尔值作为参数。如何根据实例的条件/布尔值定义类中的方法?例如:
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."
答案 0 :(得分:3)
不,因为self
引用了一个实例,并且在定义类时还没有实例。
有一些方法可以实现类似的效果(例如在__init__
内基于每个实例重命名,添加或删除方法),但无论如何都没有真正的理由这样做。
答案 1 :(得分: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'
答案 2 :(得分: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 :(得分:1)
您可以创建dict,并且可以在值的基础上访问
等功能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]
。