方法中的 self 引用了外部类的 self
也许这就是你想要的工厂方法
尽管我将在下面提供的示例代码可能与已经提供的答案相似,并且上面指向另一个答案的链接可能会满足您的愿望,因为它的形式略有不同,但我仍然会就您的要求提供我的看法。该代码是不言自明的。
class User:
def __init__(self, pk, name):
self.pk = pk
self.name = name
self._messages = None
def messages(self):
if self.messages is None:
self._messages = Messages(self.pk)
return self._messages
class Messages:
def __init__(self, usr):
self.usr = usr
def get(self):
return self._grab_data()
def _grab_data(self):
# grab the data from DB
if self.usr == 1:
print('All messages of usr 1')
elif self.usr == 2:
print('All messages of usr 2')
elif self.usr == 3:
print('All messages of usr 3')
one = User(1, 'One')
two = User(2, 'Two')
three = User(3, 'Three')
one.messages().get()
two.messages().get()
three.messages().get()
对于标签、历史等,实用的messages
方法方法是相同的。
编辑:我会再试一次,试图理解你想要达到的目标,即使你这么说
我已经尝试了很多方法来定义容器类之外的类 [...]
. 我不知道你是否尝试过继承,因为你的内部类me
,尽管它在这里并不代表什么,但看起来你仍然想以某种方式利用它的功能。你也说
方法中的 self 引用了外部类的 self
在我看来,这听起来像是您最终想要继承。那么要走的路是(通过使用继承的接近想法):
class me(object):
def __init__(self):
self.__other_arg = None # private and hidden variable
# setter and getter methods
def set_other_arg(self, new_other_arg):
self.__other_arg = new_other_arg
def get_other_arg(self):
return self.__other_arg
class Test(me):
name = 'Class Test'
@property
def message(self):
other_arg = self.get_other_arg()
if other_arg is not None:
return '{} {}'.format(self.name, other_arg)
else:
return self.name
t = Test()
t.set_other_arg('said Hello')
print(t.message)
# output >>> Class Test said Hello
我认为这可能是一种更可取的方式,而不是你的内部阶级方法,我认为,你会决定的。只是一个侧面说明,在 python 中查找 getter 和 setter,如果你想坚持给定的继承思想,它可能会对你有所帮助。