Почему python выбрал доступ к различным элементам (статическим или элементам экземпляра) в зависимости от того, когда они установлены - PullRequest
0 голосов
/ 19 сентября 2018

Я из классического ООП-мира - Java, C # и т. Д. И я некоторое время возился с некоторыми базовыми вещами Python.Я написал этот основной код:

class MyClass:
    def createInstanceMember(self):
        self.member = "instance member"

    def createClassMember(self):
        MyClass.member = "class member"

    def printMember(self):
        print(self.member)

    def printStaticMember(self):
        print(MyClass.member)   

Теперь, когда я делаю следующее:

myObj = MyClass()
myObj.createClassMember()
myObj.printMember()
myObj.createInstanceMember()
myObj.printMember()
myObj.createClassMember()
myObj.printMember()
myObj.printStaticMember()

Он печатает это:

class member
instance member
instance member
class member

Но когда я делаю это:

myObj.createInstanceMember()
myObj.printMember()
myObj.createClassMember()
myObj.printMember()
myObj.printStaticMember()

Он печатает:

instance member
instance member
class member

Здесь, когда я сначала вызываю createInstanceMember(), printMember() никогда не сможет напечатать члена класса.И он может распечатать член класса, пока createInstanceMember() не вызывается.Поэтому, хотя я понимаю, почему происходит такое поведение, я чувствую его немного странным и непоследовательным с точки зрения языкового дизайна. Почему определенная ссылка на переменную должна обращаться к разным ячейкам памяти в зависимости от последовательности выполнения других операторов? Есть ли какая-то конкретная причина / выбор дизайна, почему разработчики Python решили сделать это таким образом?Или я интерпретирую это как-то неправильно?

PS: В классических ООП-языках, скажем, в Java, это совсем не так.Там статические члены работают очень по-разному, хотя и более последовательно (или это просто моя голова, диктующая поведение Java, более последовательное).В Java у нас не может быть экземпляра и статического члена с одинаковым именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...