Использование ключевого слова Self в python? Подробное объяснение было бы возможно, как если бы вы объясняли ребенка

#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>