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
Я думаю, что это может быть предпочтительнее, чем ваш внутренний класс, мое мнение, вы решите. Только одна заметка, ищите getter и setter в python, это может помочь вам, если вы хотите придерживаться идеи наследования.