#python-3.x #class #oop #object #self
#python-3.x #класс #ооп #объект #self
Вопрос:
Я знаю, что ключевое слово self в python является ссылкой на экземпляр этого конкретного класса, но как можно создать объект в том же классе? может кто-нибудь, пожалуйста, подробно объяснить мне эту концепцию?
Комментарии:
1. вы имеете в виду экземпляр универсального объекта? или экземпляр объекта того же класса внутри себя?
Ответ №1:
Я думаю, прежде всего, что вы должны знать о различиях между классом, объектом и экземпляром.
Класс — это, по сути, определение кода сущности.
Объект или экземпляр обычно означают одно и то же: запущенный уникальный конкретный объект, загруженный в память.
Я лично делаю различие между ними, но это, вероятно, только мое мнение:
- Я использую
object
на этапе, когда я читаю код функционально, и я хочу сказать что-то вродеthis is the object kind returned by this method
. - Я использую
instance
при обращении к фактическому объекту, работающему в памяти.
===
Теперь в классе python любой член может быть определен как объект, например:
class MyClass(object):
def __init__(self):
self.some_member = MyOtherClass()
Пожалуйста, обратите внимание, что сам класс наследуется от object
, который является базовым классом (или матерью всех классов python).
In [1]: object??
Init signature: object()
Docstring:
The base class of the class hierarchy.
When called, it accepts no arguments and returns a new featureless
instance that has no instance attributes and cannot be given any.
Type: type
Subclasses: type, weakref, weakcallableproxy, weakproxy, int, bytearray, bytes, list, NoneType, NotImplementedType, ...
===
Если вместо этого вы имели в виду: «Как я могу добавить экземпляр того же класса, что и член класса?», Следующим может быть способ сделать это:
class MyClass(object):
def __init__(self):
self.another_instance = None
def set_instance(self, instance):
if not isinstance(instance, MyClass):
raise TypeError("Wrong instance type!")
self.another_instance = instance
a = MyClass()
b = MyClass()
a.set_instance(b)
Здесь я также поделюсь с вами неправильным подходом:
class MyClass(object):
def __init__(self):
self.another_instance = MyClass()
a = MyClass()
Этот код приведет к RecursionError: maximum recursion depth exceeded
. Это потому, что, если вы подумаете об этом, каждый экземпляр класса попытается создать новый экземпляр, который попытается создать новый экземпляр, который попытается… и так далее.
====
Это мог бы быть другой способ сделать это, но я бы не стал предлагать его, если только для очень конкретного и конкретного случая (возможно, что-то связанное с цепными объектами, но, безусловно, есть лучший способ справиться с этим.)
In [1]: class MyClass(object):
...: def __init__(self, has_link=False):
...: if has_link:
...: self.another_instance = MyClass(has_link=False)
...:
In [2]: a = MyClass(has_link=True)
In [3]: a.another_instance
Out[3]: <__main__.MyClass at 0x110fe00d0>