如何在类的范围内访问“self”?

时间:2014-03-04 07:27:17

标签: python class scope instance 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 个答案:

答案 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]