Я из классического ООП-мира - 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 у нас не может быть экземпляра и статического члена с одинаковым именем.