如何在类的作用域中访问“self”?

2 投票
4 回答
1004 浏览
提问于 2025-04-17 20:44

我遇到了一个有趣的问题。

假设我们有一个类,在它的构造函数里我们传入一个布尔值(也就是真或假)。那么我该如何根据这个实例的条件或布尔值来定义类里面的方法呢?举个例子:

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'

撰写回答