Как объявить статический атрибут, указывающий на тот же объект/ссылку [дубликат]

avatar
Raftel
9 августа 2021 в 02:05
140
0
0

Мне интересно, могу ли я воспроизвести приведенный ниже код 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)
Источник
Kota Mori
9 августа 2021 в 02:17
0

Я на Python 3.8 и получил True из вашего кода.

Raftel
9 августа 2021 в 02:35
0

@KotaMori Я использую python 3.9, , он добавляет возможность иметь декораторы @classmethod и @proprety. В python 3.9 MyClass.Hello является экземпляром MyClass.

Raftel
9 августа 2021 в 02:39
0

@TomKarzes Я имел в виду MyClass.Hello, мне нужно, чтобы это был тот же объект. Я действительно могу добиться этого, установив атрибут после каждого определения класса, но код будет трудно читать/обслуживать.

metatoaster
9 августа 2021 в 02:41
0

С тем, как вы определили MyClass.Hello, возвращается новый экземпляр MyClass. Python - это НЕ Java, попытка привнести идиомы Java в Python на самом деле затруднит чтение/поддержку.

Raftel
9 августа 2021 в 02:42
0

@metatoaster Я новичок в python, мне бы хотелось посмотреть, как это можно сделать, я не против изменить код

metatoaster
9 августа 2021 в 02:44
0

Если вы обратитесь к связанному ответу здесь, простое определение атрибута Hello = MyClass(message="hello world") внутри определения MyClass приведет к тому, что вы хотите.

Raftel
9 августа 2021 в 02:48
0

@metatoaster это вызывает NameError: name 'MyClass' is not defined, я могу установить другой класс, но не тот же класс

metatoaster
9 августа 2021 в 02:49
1

Исправление, вам может потребоваться назначить его постфактум, поскольку сам класс должен быть полностью определен и сначала назначен глобальной области видимости, просто установите MyClass.Hello = MyClass(...) после определения класса.

Raftel
9 августа 2021 в 02:57
0

о, спасибо, я не знал, что вы можете расширить класс после объявления (не уверен, считается ли это плохой практикой), вы можете добавить ответ, и я приму его

metatoaster
9 августа 2021 в 03:00
1

Как я уже отмечал, Python очень сильно отличается от Java, здесь нет настоящих частных переменных или финальных статических переменных — практически всем можно манипулировать по желанию. Таким образом, нет смысла пытаться применять частные или однократно записываемые переменные в Python, учитывая, что любая реализация, которая принудительно/эмулирует это, может быть просто отменена путем обращения процесса вспять.

Ответы (0)