Мне интересно, могу ли я воспроизвести приведенный ниже код Java с помощью python, он объявляет статический атрибут Hello
и назначает новый объект, когда я вызываю MyClass.Hello
дважды, он возвращает ту же ссылку потому что он статичен.
class MyClass {
public final String message;
public MyClass(String message) {
this.message = message;
}
public static MyClass Hello = new MyClass("hello world");
}
public class HelloWorld {
public static void main(String []args){
// output true
System.out.println(MyClass.Hello == MyClass.Hello);
}
}
Я попробовал следующий код, но, к сожалению, он возвращает другую ссылку. Я открыт для альтернативных решений
class MyClass:
def __init__(self, message):
self.message = message
@classmethod
@property
def Hello(cls):
return cls(message="hello world")
# output False
print(MyClass.Hello == MyClass.Hello)
Я на Python 3.8 и получил True из вашего кода.
@KotaMori Я использую python 3.9, , он добавляет возможность иметь декораторы
@classmethod
и@proprety
. В python 3.9 MyClass.Hello является экземпляром MyClass.@TomKarzes Я имел в виду
MyClass.Hello
, мне нужно, чтобы это был тот же объект. Я действительно могу добиться этого, установив атрибут после каждого определения класса, но код будет трудно читать/обслуживать.С тем, как вы определили
MyClass.Hello
, возвращается новый экземплярMyClass
. Python - это НЕ Java, попытка привнести идиомы Java в Python на самом деле затруднит чтение/поддержку.@metatoaster Я новичок в python, мне бы хотелось посмотреть, как это можно сделать, я не против изменить код
Если вы обратитесь к связанному ответу здесь, простое определение атрибута
Hello = MyClass(message="hello world")
внутри определенияMyClass
приведет к тому, что вы хотите.@metatoaster это вызывает
NameError: name 'MyClass' is not defined
, я могу установить другой класс, но не тот же классИсправление, вам может потребоваться назначить его постфактум, поскольку сам класс должен быть полностью определен и сначала назначен глобальной области видимости, просто установите
MyClass.Hello = MyClass(...)
после определения класса.о, спасибо, я не знал, что вы можете расширить класс после объявления (не уверен, считается ли это плохой практикой), вы можете добавить ответ, и я приму его
Как я уже отмечал, Python очень сильно отличается от Java, здесь нет настоящих частных переменных или финальных статических переменных — практически всем можно манипулировать по желанию. Таким образом, нет смысла пытаться применять частные или однократно записываемые переменные в Python, учитывая, что любая реализация, которая принудительно/эмулирует это, может быть просто отменена путем обращения процесса вспять.