Яке призначення слова "Я"?


1130

Яке призначення selfслова в Python? Я розумію, це стосується конкретного об'єкта, створеного з цього класу, але я не можу зрозуміти, чому його явно потрібно додавати до кожної функції в якості параметра. Для ілюстрації, в Ruby я можу це зробити:

class myClass
    def myFunc(name)
        @name = name
    end
end

Що я розумію, досить легко. Однак у Python мені потрібно включити self:

class myClass:
    def myFunc(self, name):
        self.name = name

Хтось може поговорити зі мною через це? Це не те, що я зіткнувся зі своїм (правда, обмеженим) досвідом.


111
Вам може бути цікавим цей нарис "Чому явне самоврядування має залишатися" від Гвідо ван Россума
unutbu

14
Дивіться також "Чому в" визначеннях та викликах методу "явно слід використовувати" self ": docs.python.org/faq/…
unutbu

37
"Що я розумію, досить легко" --- Цілком суб'єктивно, ти не думаєш? Що робить @nameінтуїтивнішим ніж self.name? Останній, ІМО, більш інтуїтивний.
Санта

14
У цьому полягає ключова відмінність функції та методу класу. Функція плаває вільно, без навантаження. Метод класу (екземпляра) повинен знати про його батьківські (і батьківські властивості), тому вам потрібно передати посилання на батьківський клас (як самості ). Це лише одне менш неявне правило, яке потрібно інтерналізувати, перш ніж розуміти ООП. Інші мови обирають синтаксичний цукор над семантичною простотою, python - це не інші мови.
Еван Плейс

9
Я не думаю, що "явне краще, ніж неявне" насправді добре пояснює цей вибір дизайну. @fooі self.fooнастільки ж явні, оскільки не потрібно мати неявну роздільну здатність (наприклад, у C ++, до членів екземплярів можна отримати доступ "неявно" без "явного" використання просторів імен). Різниця лише в тому, що Рубі вводить новий семантичний (@), а Python - ні. Незалежно від того, чи варто було б нове семантичне значення уникнути багатослівності, це суто суб'єктивно. Хоча слід зазначити, що більшість сучасних мов вирішили ввести тут концепцію (наприклад, php's $ this, JS's this).
Цзінь

Відповіді:


710

Причина, яку потрібно використовувати, self.полягає в тому, що Python не використовує @синтаксис для позначення атрибутів екземпляра. Python вирішив зробити методи таким чином, щоб примірник, до якого належить метод, передається автоматично, але не отримується автоматично: перший параметр методів - це екземпляр, на який викликається метод. Це робить методи абсолютно такими ж, як і функції, і залишає власне ім’я використовувати для вас (хоча selfце умова, і люди, як правило, нахмуриться на вас, коли ви використовуєте щось інше.) selfКод не є спеціальним, це просто інший об'єкт .

Python міг би зробити щось інше, щоб відрізнити звичайні імена від атрибутів - спеціальний синтаксис, як у Ruby, або вимагаючи декларацій, таких як C ++ та Java, або, можливо, ще щось інше - але це не так. Python - все для того, щоб зробити речі чіткими, зробити очевидним, що саме робити, і хоча це робить не цілком скрізь, він робить це, наприклад, атрибутами. Ось чому при призначенні атрибуту екземпляра потрібно знати, якому екземпляру призначити, і саме тому він потрібен self..


23
@Georg: clsпосилається на об’єкт класу, а не на об'єкт екземпляра
SilentGhost

17
@SilentGhost: Насправді назва першого параметра - це все, що ви хочете. Щодо класових методів, конвенція полягає у використанні clsта selfвикористовується звичайно, наприклад, для методів. Якби я хотів, я міг би використовувати selfдля classmethods і, clsнаприклад, методи. Я також міг би скористатися bobі, fnordякщо мені сподобалось.
SingleNegationElimination

67
Мені здається цікавим те, що громада обрала thisзамість цього self. Чи selfє історія, про яку я не знаю у старих мовах програмування?
Жюль ГМ

24
@Julius Походили з умовних положень selfModula-3, див. Цю відповідь, щоб отримати докладнішу інформацію про цей вибір. (Відмова: його шахта).
Бакуріу

9
@Julius selfКлючове слово (Smalltalk, 1980) передує thisключовому слову (від C ++). Дивіться: stackoverflow.com/questions/1079983/…
Уес Тернер

425

Візьмемо простий векторний клас:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

Ми хочемо мати метод, який обчислює довжину. Як це виглядатиме, якби ми хотіли визначити це всередині класу?

    def length(self):
        return math.sqrt(self.x ** 2 + self.y ** 2)

Як він повинен виглядати, коли ми мали б визначити це як глобальний метод / функцію?

def length_global(vector):
    return math.sqrt(vector.x ** 2 + vector.y ** 2)

Отже вся структура залишається однаковою. Як я можу цим скористатися? Якщо припустити на мить, що ми не написали lengthметод для нашого Vectorкласу, ми могли б зробити це:

Vector.length_new = length_global
v = Vector(3, 4)
print(v.length_new()) # 5.0

Це працює, тому що перший параметр length_global, може бути використаний повторно як selfпараметр в length_new. Це було б неможливо без явного self.


Інший спосіб зрозуміти необхідність явного self- бачити, куди Python додає синтаксичний цукор. Коли ви пам’ятаєте, що це, в основному, дзвінок на кшталт

v_instance.length()

внутрішньо трансформується в

Vector.length(v_instance)

легко зрозуміти, куди selfпідходить. Ви фактично не пишете методи екземпляра в Python; що ви пишете - це методи класу, які повинні приймати екземпляр як перший параметр. Отже, вам доведеться розмістити параметр екземпляра десь явно.


4
Vector.length_new = length_global ... Я фактично почав використовувати такий синтаксис у своїх оголошеннях класу. Щоразу, коли я хочу лише успадкувати деякі методи з іншого класу, я просто явно копіюю посилання на методи.
Jeeyoung Kim

2
було б справедливо сказати, що "метод екземпляра" python - це просто синтаксичний цукор статичних глобальних методів (як у Java чи C ++) з об'єктом екземпляра, переданим для пакування декількох атрибутів? --- добре, це начебто напівправда, оскільки в поліморфізмі більш важливою метою "цього" (як у java) або "self" є дати правильній реалізації методів. У Python це є. тому виклик myobj.someMethod () дорівнює TheClassOfMyObj.someMethod (myobj) у python. зауважте, що "TheClassOfMyObj" python автоматично з'ясовується з "self", інакше вам доведеться це дізнатися.
плюшевий плюшевий плюшевий

3
Infact - це не лише методи екземплярів, а просто методи класу, але методи - це лише функції, які є членами класу, як Vector.length_new = length_globalпоказує.
RussW

1
"Це працює, тому що перший параметр length_global може бути використаний повторно як параметр self у length_new. Це не було б можливим без явного". " - працювало б так само. це було б повторно використане для неявної самості ... другий приклад - кругові міркування - ви повинні явно розмістити там себе, тому що python потребує явного "self".
Каролі Хорват

1
@KarolyHorvath: Зрозуміло, також можна було б мати мову з моделлю, де внутрішньо визначені методи не потребують явного самоврядування, а зовні визначених методів. Але я б сказав, що є певна послідовність у тому, щоб вимагати явного самоврядування в обох випадках, що робить його законною причиною робити це так. Інші мови можуть обирати різні підходи.
Дебільські

421

Скажімо, у вас клас, ClassAякий містить метод, methodAвизначений як:

def methodA(self, arg1, arg2):
    # do something

і ObjectA є екземпляром цього класу.

Тепер, коли ObjectA.methodA(arg1, arg2)викликається, python внутрішньо перетворює його для вас як:

ClassA.methodA(ObjectA, arg1, arg2)

selfМінлива відноситься до самого об'єкта.


94
Я прочитав усі інші відповіді і щось зрозуміло, я прочитав цю, і тоді це все мало сенс.
Сет

3
Це прибило це для мене!
Бернар 'Бета Берлін' Парах

2
Чому б не зберегти ці кишки всередині, як це робить Рубі?
Cees Timmerman

Але в методі __init __ (self) він приймає себе, тоді навіть не створюючи об'єкт, як він відноситься до себе?
saurav

Якщо серйозно, це набагато краще, ніж приклад Дебільського, оскільки він не надто складний і люди можуть не бути знайомі з векторами.
NoName

215

Коли об'єкти інстанціюються, сам об'єкт передається в параметр self.

введіть тут опис зображення

Через це дані об'єкта прив’язані до об'єкта. Нижче наведено приклад того, як ви могли б хотіти візуалізувати, як можуть виглядати дані кожного об’єкта. Зверніть увагу, як "self" замінено на ім'я об'єктів. Я не кажу, що наведена нижче схема прикладу є абсолютно точною, але, сподіваємось, вона служить цілі у візуалізації використання себе.

введіть тут опис зображення

Об'єкт передається в параметр self, щоб об'єкт міг зберігати власні дані.

Хоча це може бути не зовсім точно, подумайте про процес інстанції об'єкта таким чином: Коли об’єкт зроблений, він використовує клас як шаблон для власних даних та методів. Без передачі власного імені в параметр self, атрибути та методи у класі залишатимуться як загальний шаблон і не посилаються на (належать) об'єкту. Таким чином, передаючи ім'я об'єкта в параметр self, це означає, що якщо 100 об'єктів примірники з одного класу, всі вони можуть відслідковувати власні дані та методи.

Дивіться ілюстрацію нижче:

введіть тут опис зображення


Гей там, коли доступ атрибутів Боба, наприклад з допомогою «bob.name ()», ви на самому справі екранним боб (). Self.name так би мовити від « INIT » правою?
udarH3

3
Коли ви пишете bob.name () у наведеному вище коментарі, ви маєте на увазі, що bob має метод, який називається name () через те, що ви додали дужки після імені. У цьому прикладі, однак, немає такого способу. 'bob.name' (у якому немає круглих дужок) здійснює прямий доступ до атрибута, названого ім'ям, методом init (конструктор). Коли метод bob's speak називається, це метод, який отримує доступ до атрибута name і повертає його в операторі print. Сподіваюсь, це допомагає.
sw123456

3
Ні, ви отримуєте значення self.name, яке для об'єкта bob є насправді bob.name, оскільки ім'я об'єкта передається в параметр self, коли він створюється (інстанціюється). Знову ж таки, сподівання, що це допомагає. Не соромтеся просити основну посаду, якщо вона є.
sw123456

2
Ім’я присвоюється імені self.name при створенні. Після створення об’єкта всі змінні, що належать об'єкту, є тими, що мають префікс "self". Пам'ятайте, що "self" замінюється ім'ям об'єкта, коли він створюється з класу.
sw123456

5
Ось як ви пояснюєте речі! приємна робота :)
пента

80

Мені подобається цей приклад:

class A: 
    foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: [5]

class A: 
    def __init__(self): 
        self.foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: []

18
тому vars without self - це просто статична варша класу, як у java
плюшевий плюшевий плюшевий

5
плюшевий плюшевий плюшевий, ти не зовсім прав. Поведінка (статична або нестатична) залежить не тільки від selfтипу змінної, але й від неї. Спробуйте зробити перший приклад з простим цілим числом, а не списком. Результат був би зовсім іншим.
Костянтин

2
Насправді, моє запитання з цього питання полягає в тому, чому вам дозволяють говорити a.fooв першому прикладі, а не A.foo? Очевидно fooналежить до класу ...
Радон Росборо

Ви можете викликати статичні члени з екземплярів об'єкта на більшості мов. Чому це дивно?
Паарт

2
@RadonRosborough Тому що в першому прикладі, aі bє мітки (або покажчики) для A()(класу). a.fooпосилається на A().fooметод класу. У другому прикладі, проте, aстає посилання на екземпляр з A(), як це робить b. Тепер, коли вони є екземплярами замість самого об’єкта класу, self дозволяє fooметоду працювати над екземплярами.
LegendaryDude

40

Я продемонструю за допомогою коду, що який не використовує класи :

def state_init(state):
    state['field'] = 'init'

def state_add(state, x):
    state['field'] += x

def state_mult(state, x):
    state['field'] *= x

def state_getField(state):
    return state['field']

myself = {}
state_init(myself)
state_add(myself, 'added')
state_mult(myself, 2)

print( state_getField(myself) )
#--> 'initaddedinitadded'

Класи - це лише спосіб уникнути переходу в цю "стан" річ весь час (та інші приємні речі, такі як ініціалізація, склад класу, рідко потрібні метакласи та підтримка користувальницьких методів для переосмислення операторів).

Тепер давайте продемонструємо наведений вище код за допомогою вбудованої машини класу python, щоб показати, як це в основному те саме.

class State(object):
    def __init__(self):
        self.field = 'init'
    def add(self, x):
        self.field += x
    def mult(self, x):
        self.field *= x

s = State()
s.add('added')    # self is implicitly passed in
s.mult(2)         # self is implicitly passed in
print( s.field )

[мігрував мою відповідь із дубліката закритого запитання]


1
Я б хотів, щоб Python з цукровим покриттям обробляв обробку, як і Рубі.
Cees Timmerman

20

Наступні уривки з документації про себе на Python :

Як і в Modula-3, не існує скорочень [у Python] для посилання членів об'єкта з його методами: функція методу оголошується явним першим аргументом, що представляє об'єкт, який надається неявно викликом.

Часто перший аргумент методу називається self. Це не що інше, як умова: сам ім'я абсолютно не має особливого значення для Python. Однак зауважте, що, не дотримуючись конвенції, ваш код може бути менш читабельним для інших програмістів Python, а також можливо, що може бути написана програма браузера класів, яка покладається на таку конвенцію.

Для отримання додаткової інформації дивіться навчальний посібник з документацією Python про класи .


20

Як і всі інші причини, вже зазначені, це дозволяє полегшити доступ до перекритих методів; можна зателефонуватиClass.some_method(inst) .

Приклад того, де це корисно:

class C1(object):
    def __init__(self):
         print "C1 init"

class C2(C1):
    def __init__(self): #overrides C1.__init__
        print "C2 init"
        C1.__init__(self) #but we still want C1 to init the class too
>>> C2()
"C2 init"
"C1 init"

17

Його використання подібне до використання thisключового слова на Java, тобто для посилання на поточний об'єкт.


2
клас myClass: def myFunc (це, ім'я): this.name = name
LEMUEL ADANE

16

Python - це не мова, побудована для об'єктно-орієнтованого програмування на відміну від Java або C ++.

Викликаючи статичний метод у Python, просто записується метод із регулярними аргументами всередині нього.

class Animal():
    def staticMethod():
        print "This is a static method"

Однак об’єктному методу, який вимагає від вас зробити змінну, яка є твариною, в цьому випадку потрібен аргумент self

class Animal():
    def objectMethod(self):
        print "This is an object method which needs an instance of a class"

Метод self використовується також для позначення змінного поля в класі.

class Animal():
    #animalName made in constructor
    def Animal(self):
        self.animalName = "";


    def getAnimalName(self):
        return self.animalName

У цьому випадку self посилається на змінну animalName усього класу. ПАМ’ЯТАЙТЕ: Якщо у вас є змінна в межах методу, самодоступ не працюватиме. Ця змінна просто існує лише під час запуску цього методу. Для визначення полів (змінних усього класу) ви повинні визначити їх ВНІШНЯМИ методи класу.

Якщо ви не розумієте жодного слова того, що я говорю, то Google "Об'єктно-орієнтоване програмування". Коли ви це зрозумієте, вам навіть не потрібно буде ставити це питання :).


+1 через відмінність між staticMethod()та objectMethod(self). Я хотів би додати, що для виклику першого, ви б сказали Animal.staticMethod(), objectMethod()потрібен примірник:a = Animal(); a.objectMethod()
Laryx Decidua

Те, що ви говорите, не є 100% правдою. Це просто умовність. Ви все ще можете викликати статичний метод із створеного об'єкта. Ви просто не зможете використовувати жодних членів класу, оскільки ви не заявили про себе. Я навіть можу зателефонувати Animal.objectMethod (animalObj), щоб викликати нестатичний. В основному це означає, що статичний метод - це лише метод, який не використовує змінних членів. Не повинно бути ніякої необхідності заявляти про себе. Думаю, це дурна вимога мови. Такі мови, як Lua та C ++, надають вам невідповідні змінні поза кадром.
користувач441521

Ви зробили марну декларацію рядка animalName та збій у методі animalName.
Cees Timmerman

3
@ytpillai Невідповідне. Заплутаний і неправильний код не слід подавати як відповідь.
Cees Timmerman

1
def getAnimalNameщоб не клобувати рядок, який ви намагаєтеся повернути, і selfпосилається на екземпляр класу, а не на будь-яке поле всередині нього.
Cees Timmerman

10

Тут слід дотримуватися Python zen "явне краще, ніж неявне". Це справді посилання на ваш об’єкт класу. Наприклад, у Java та PHP це називається this.

Якщо user_type_nameце поле на вашій моделі, ви отримуєте доступ до нього self.user_type_name.


10

Перш за все, self - це звичайна назва, ви можете поставити що-небудь інше (будучи узгодженим) замість нього.

Він посилається на сам об’єкт, тому коли ви його використовуєте, ви заявляєте, що .name та .age є властивостями об'єктів Student (примітка, а не для класу Student), які ви збираєтеся створити.

class Student:
    #called each time you create a new Student instance
    def __init__(self,name,age): #special method to initialize
        self.name=name
        self.age=age

    def __str__(self): #special method called for example when you use print
        return "Student %s is %s years old" %(self.name,self.age)

    def call(self, msg): #silly example for custom method
        return ("Hey, %s! "+msg) %self.name

#initializing two instances of the student class
bob=Student("Bob",20)
alice=Student("Alice",19)

#using them
print bob.name
print bob.age
print alice #this one only works if you define the __str__ method
print alice.call("Come here!") #notice you don't put a value for self

#you can modify attributes, like when alice ages
alice.age=20
print alice

Код тут


1
Ваша відповідь здається мені найбільш зрозумілою. +1
Pawel

9

selfє посиланням на сам об'єкт, тому вони однакові. Методи Python не викликаються в контексті самого об'єкта. selfв Python може використовуватися для роботи з користувацькими моделями об'єктів або чимось подібним.


8

Використання аргументу, умовно названого self , не так важко зрозуміти, як це необхідно? Або щодо того, чому це прямо згадують? Це, мабуть, є більшою проблемою для більшості користувачів, які розглядають це питання, або якщо це не так, у них, безумовно, виникне те саме питання, що вони рухаються вперед, вивчаючи пітон. Я рекомендую їм прочитати ці кілька блогів:

1: Використання самостійно поясненого

Зауважте, що це не ключове слово.

Перший аргумент кожного методу класу, включаючи init, завжди є посиланням на поточний екземпляр класу. За умовою, цей аргумент завжди називають «я». У методі init self посилається на новостворений об'єкт; в інших методах класу він посилається на екземпляр, метод якого називався. Наприклад, наведений нижче код такий же, як і вищезгаданий код.

2: Чому у нас це так і чому ми не можемо усунути це як аргумент, як Java, і натомість мати ключове слово

Ще одне, що я хотів би додати, це те, що необов’язковий selfаргумент дозволяє мені оголошувати статичні методи всередині класу, не пишучи self.

Приклади коду:

class MyClass():
    def staticMethod():
        print "This is a static method"

    def objectMethod(self):
        print "This is an object method which needs an instance of a class, and that is what self refers to"

PS : Це працює лише в Python 3.x.

У попередніх версіях ви повинні явно додати @staticmethodдекоратор, інакше selfаргумент обов'язковий.


7

Я здивований, що Луа ніхто не виховував. Lua також використовує змінну "self", однак її можна опустити, але все ще використовувати. C ++ робить те ж саме, що і "це". Я не бачу жодної причини заявляти про "власну" у кожній функції, але ви все одно можете використовувати її так само, як ви можете з Lua та C ++. Для мови, яка пишається тим, що вона є короткою, дивно, що вона вимагає від вас оголосити змінну self.


6

Погляньте на наступний приклад, який чітко пояснює мету self

class Restaurant(object):  
    bankrupt = False

    def open_branch(self):
        if not self.bankrupt:
           print("branch opened")

#create instance1
>>> x = Restaurant()
>>> x.bankrupt
False

#create instance2
>>> y = Restaurant()
>>> y.bankrupt = True   
>>> y.bankrupt
True

>>> x.bankrupt
False  

self використовується / потрібна для розмежування між примірниками.

Джерело: сама змінна в поясненому python - Pythontips


Так, я думаю, ми знаємо, чому використовується self, але питання полягає в тому, чому мова змушує вас явно це заявляти. Для багатьох інших мов цього не потрібно, і мова, яка пишається тим, що вона є короткою, ви можете подумати, що вони просто дадуть вам змінну за кадром, яку можна використовувати, як Lua або C ++ (це).
користувач441521

3
@ kmario23 Ви отримали відповідь звідси: pythontips.com/2013/08/07/the-self-variable-in-python-explained Будь ласка, завжди підтверджуйте оригінальних авторів, коли публікуєте відповіді як свої.
geekidharsh

@geekidharsh спасибі, я додав замітку!
kmario23

5

Це тому, що, наскільки розроблений пітон, альтернативи навряд чи спрацюють. Python розроблений для того, щоб дозволяти визначати методи або функції в контексті, коли ні неявна this(a-la Java / C ++), ні явна @(a-la ruby) не працюватиме. Наведемо приклад з явним підходом з умовами python:

def fubar(x):
    self.x = x

class C:
    frob = fubar

Тепер fubarфункція не буде працювати, оскільки передбачається, що selfце глобальна змінна (і в frobтому числі). Альтернативою було б виконання методів із заміненою глобальною областю (де selfоб'єкт).

Явний підхід був би

def fubar(x)
    myX = x

class C:
    frob = fubar

Це означатиме, що myXінтерпретується як локальна змінна в fubarfrobтакож). Альтернативою тут було б виконання методів із заміненою локальною областю, яка зберігається між викликами, але це видалило б можливість локальних змінних методу.

Однак нинішня ситуація добре працює:

 def fubar(self, x)
     self.x = x

 class C:
     frob = fubar

тут при виклику як метод frobотримає об'єкт , на якому він викликається через selfпараметр, і fubarвсе ще може бути викликаний з об'єктом в якості параметра і працювати так само (він є таким же , як C.frobя думаю).


3

У __init__методі «self» посилається на новостворений об’єкт; в інших методах класу він посилається на екземпляр, метод якого називався.

Я, як ім'я, - це лише умова , називайте його як хочете! але, використовуючи його, наприклад, для видалення об'єкта, ви повинні використовувати те саме ім'я:, __del__(var)де varбуло використано в__init__(var,[...])

Ви також повинні поглянути на clsце, щоб мати більшу картину . Ця публікація може бути корисною.


3

self діє так, як поточне ім'я об'єкта або екземпляр класу.

# Self explanation.


 class classname(object):

    def __init__(self,name):

        self.name=name
        # Self is acting as a replacement of object name.
        #self.name=object1.name

   def display(self):
      print("Name of the person is :",self.name)
      print("object name:",object1.name)


 object1=classname("Bucky")
 object2=classname("ford")

 object1.display()
 object2.display()

###### Output 
Name of the person is : Bucky
object name: Bucky
Name of the person is : ford
object name: Bucky

1

self неминуче.

Було просто питання, яке має selfбути неявним або явним. Guido van Rossumвирішивши це питання, сказавши, що selfвін повинен залишатися .

То де selfжити?

Якби ми просто дотримувались функціонального програмування, нам це б не потрібно self. Як тільки ми входимо в Python OOP ми знаходимоself там.

Ось типовий випадок class Cвикористання методуm1

class C:
    def m1(self, arg):
        print(self, ' inside')
        pass

ci =C()
print(ci, ' outside')
ci.m1(None)
print(hex(id(ci))) # hex memory address

Ця програма виведе:

<__main__.C object at 0x000002B9D79C6CC0>  outside
<__main__.C object at 0x000002B9D79C6CC0>  inside
0x2b9d79c6cc0

Так selfзберігається адреса пам'яті екземпляра класу. Мета в selfтому, щоб містити посилання на методи екземпляра і для нас , щоб мати явний доступ до цим посиланням.


Зауважте, що існує три різних типи методів класу:

  • статичні методи (читання: функції),
  • методи класу,
  • екземплярні методи (згадані).

0

від документів ,

особливість у методах полягає в тому, що об'єкт екземпляра передається як перший аргумент функції. У нашому прикладі виклик x.f()точно рівносильний MyClass.f(x). Взагалі, виклик методу зі списком n аргументів еквівалентний виклику відповідної функції зі списком аргументів, який створюється вставкою об'єкта екземпляра методу перед першим аргументом.

перед цим пов'язаний фрагмент,

class MyClass:
    """A simple example class"""
    i = 12345

    def f(self):
        return 'hello world'

x = MyClass()


-2

це явна посилання на об'єкт екземпляра класу.


21
Я не думаю, що це допомагає Richzilla зрозуміти причину, що його стоїть.
Георг Шоллі

1
@SilentGhost: ти прибив її. Я перебуваю під враженням. якщо я правильно це розумію: я створюю об'єкт як екземпляр визначеного класу і параметр self посилається на цей об’єкт? Я розумію, що "я" посилається неявно на сам клас, але було б чудово, якби ви пояснили свою відповідь трохи більше.
dryrynicki
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.