Я говорю о вложенных классах. По сути, у меня есть два класса, которые я моделирую. Класс DownloadManager и класс DownloadThread. Очевидная концепция ООП здесь - композиция. Однако композиция не обязательно означает вложенность, верно?
У меня есть код, который выглядит примерно так:
class DownloadThread:
def foo(self):
pass
class DownloadManager():
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadThread())
Но теперь мне интересно, есть ли ситуация, когда вложение было бы лучше. Что-то вроде:
class DownloadManager():
class DownloadThread:
def foo(self):
pass
def __init__(self):
dwld_threads = []
def create_new_thread():
dwld_threads.append(DownloadManager.DownloadThread())
Я не знаю Python, но ваш вопрос кажется очень общим. Не обращайте на меня внимания, если это относится к Python.
Вложенность классов зависит от области видимости. Если вы думаете, что один класс будет иметь смысл только в контексте другого, то первый, вероятно, является хорошим кандидатом на роль вложенного класса.
Это распространенный шаблон, когда вспомогательные классы превращаются в частные вложенные классы.
источник
private
классов не так уж и применима в Python, но подразумеваемая область использования определенно применима.Есть еще одно использование вложенного класса, когда нужно создать унаследованные классы, расширенные функции которых инкапсулированы в конкретный вложенный класс.
См. Этот пример:
Обратите внимание, что в конструкторе
foo
строкаself.a = self.bar()
будет создавать,foo.bar
когда конструируемый объект фактически являетсяfoo
объектом, иfoo2.bar
объект, когда конструируемыйfoo2
объект фактически является объектом.Если вместо этого класс
bar
был определен вне классаfoo
, а также его унаследованная версия (которая могла бы вызываться,bar2
например), тогда определение нового классаfoo2
было бы намного более болезненным, потому что конструкторуfoo2
нужно было бы заменить свою первую строку наself.a = bar2()
, что подразумевает переписывание всего конструктора.источник
В этом нет никакой пользы, кроме случаев, когда вы имеете дело с метаклассами.
class: suite на самом деле не то, что вы думаете. Это странный прицел, и он делает странные вещи. Это действительно даже не класс! Это просто способ собрать некоторые переменные - имя класса, основы, небольшой словарь атрибутов и метакласс.
Имя, словарь и основы передаются функции, которая является метаклассом, а затем присваивается переменной name в области, в которой находился class: suite.
То, что вы можете получить, возясь с метаклассами и действительно вкладывая классы в стандартные классы, сложнее для чтения кода, сложнее для понимания кода и странных ошибок, которые ужасно трудно понять, не зная, почему этот `` класс '' Область видимости полностью отличается от любой другой области действия Python.
источник
except myInstanceObj.CustomError, e:
Вы можете использовать класс как генератор классов. Вроде (в некоторых код без манжеты :)
Я чувствую, что когда вам понадобится эта функция, вам будет очень понятно. Если вам не нужно делать что-то подобное, вероятно, это не лучший вариант использования.
источник
Нет, композиция не означает вложенность. Было бы разумно иметь вложенный класс, если вы хотите больше скрыть его в пространстве имен внешнего класса.
Во всяком случае, практического смысла вложения в вашем случае не вижу. Это затруднило бы чтение (понимание) кода, а также увеличило бы отступ, что сделало бы строки короче и более склонными к расщеплению.
источник