Python - инициализация встроенных переменных / атрибутов - PullRequest
2 голосов
/ 07 октября 2011

Когда и как инициализируются встроенные атрибуты?__doc__, __name__ (я думаю, я знаю об этом :)), __class__, __setattr__ и т. Д.

В моем другом вопросе, касающемся строк документации, один из ответов упоминал, что строки документации простопростые строки, и я попытался с ', " и """, и все они работали.Но когда я использовал переменную, присвоившую строковое значение, и поместил эту переменную вместо строки документации, это не сработало.Вот почему я начал задаваться вопросом, когда атрибут __doc__ инициализируется?

РЕДАКТИРОВАТЬ: Это то, что я пробовал на интерпретаторе (да, это безумие, и я странный: D)

doc_str = "Says Hello world"


class HelloWorld():
    def say():
        doc_str
        print("Hello world !")

h_w = HelloWorld()
h_w.say.__doc__


class AnotherHelloWorld():

    def __init__(self, doc_str="Says HELLO WORLD"):
        self.doc_str = doc_str

    def say(self):
        self.doc_str
        print("HELLO WORLD !")

a_h_w = AnotherHelloWorld("Scream... HELLO WORLD!")
a_h_w.say.__doc__


class YetAnotherHelloWorld():

    def __init__(self, doc_str="Still does't say HELLO WORLD :( "):
        self.doc_str = doc_str

    def say(self):
          "%s"%self.doc_str
          print("HELLO WORLD .. Again!")

1 Ответ

2 голосов
/ 07 октября 2011

Это отличается для каждого. (В конце концов, каждый из них special !). Некоторые атрибуты класса, некоторые атрибуты экземпляра, некоторые наследуются.

__doc__ инициализируется при создании класса (вы также можете передать его в аргументе dict конструктору type). Специальный синтаксис работает только для строковых литералов, но если вам нужна переменная строка документации, вы можете установить ее явно:

class SomeClass(object):
    __doc__ = "This is class #{0}.".format(1)

__name__ также устанавливается при создании класса.

__class__ устанавливается при создании экземпляра (т.е. в __new__).

__setattr__ и друзья наследуются от object.

...