Получение имени экземпляра в классе __ init __ () [дубликат]

Венгерское Соглашение о присвоении имен может быть полезным, когда используется правильно, к сожалению, оно имеет тенденцию неправильно использоваться, как правило.

статья Read Joel Spolsky, Делающая Неправильный Взгляд Кода Неправильно для соответствующей перспективы и выравнивания.

По существу, основанная на типе Венгерская запись, где переменные снабжаются префиксом информацию о своем типе (например, ли объект является строкой, дескриптором, интервалом, и т.д.) главным образом бесполезна и обычно просто добавляет наверху с очень небольшим преимуществом. Это, к сожалению, Венгерская запись, с которой большинство людей знакомо. Однако намерение Венгерской записи, как предполагается состоит в том, чтобы добавить информацию о "виде" данных, которые содержит переменная. Это позволяет Вам видам раздела данных из других видов данных, которым нельзя позволить быть смешанными вместе кроме, возможно, посредством некоторого процесса преобразования. Например, основанные на пикселе координаты по сравнению с координатами в других единицах или небезопасный ввод данных пользователем по сравнению с данными из безопасных источников, и т.д.

Взгляд на него, этот путь при нахождении себя spelunking через код для обнаружения информации о переменной тогда Вы, вероятно, должен скорректировать Вашу схему именования для содержания той информации, это - сущность венгерского соглашения.

Примечание, что альтернатива Венгерской записи должна использовать больше классов для показа намерения переменного использования вместо того, чтобы полагаться на типы примитивов везде. Например, вместо того, чтобы иметь переменные префиксы для небезопасного ввода данных пользователем, у Вас могут быть класс обертки простой строки для небезопасного ввода данных пользователем и отдельный класс обертки для безопасных данных. Это имеет преимущество, на языках со строгим контролем типов, осуществления разделения компилятором (даже на меньшем количестве языков со строгим контролем типов, можно обычно добавлять собственный код растяжки), но добавляет весьма значительную сумму издержек.

18
задан Jonathan Feinberg 6 November 2009 в 21:03
поделиться

4 ответа

У экземпляров нет имен. К тому времени, когда глобальное имя ThisObject связывает с экземпляром, созданным путем вычисления конструктора SomeObject , конструктор завершил свою работу.

Чтобы объект имел имя, просто передайте это имя в конструкторе.

def __init__(self, name):
    self.name = name
19
ответ дан 30 November 2019 в 06:17
поделиться

Что ж, есть почти способ сделать это:

#!/usr/bin/env python
import traceback
class SomeObject():
    def __init__(self, def_name=None):
        if def_name == None:
            (filename,line_number,function_name,text)=traceback.extract_stack()[-2]
            def_name = text[:text.find('=')].strip()
        self.defined_name = def_name

ThisObject = SomeObject()
print ThisObject.defined_name 
# ThisObject

Модуль трассировки позволяет вам просмотреть код, используемый для вызова SomeObject (). Небольшой перебор строк text [: text.find ('=')]. Strip () можно угадайте, каким должно быть def_name.

Однако этот хакер хрупкий. Например, это работает не так хорошо:

ThisObject,ThatObject = SomeObject(),SomeObject()
print ThisObject.defined_name
# ThisObject,ThatObject
print ThatObject.defined_name 
# ThisObject,ThatObject

Итак, если вы использовали этот прием, вы должны иметь в виду, что вы должны вызвать SomeObject () с использованием простого оператора python:

ThisObject = SomeObject()

Между прочим, в качестве дополнительного примера использования трассировки, если вы определите

def pv(var):
    # stack is a list of 4-tuples: (filename, line number, function name, text)
    # see http://docs.python.org/library/traceback.html#module-traceback
    #
    (filename,line_number,function_name,text)=traceback.extract_stack()[-2]
    # ('x_traceback.py', 18, 'f', 'print_var(y)')
    print('%s: %s'%(text[text.find('(')+1:-1],var))

, вы можете вызвать

x=3.14
pv(x)
# x: 3.14

, чтобы вывести и имя переменной, и ее значение.

22
ответ дан 30 November 2019 в 06:17
поделиться

Это не может работать, представьте себе следующее: a = b = TheMagicObjet () . Имена не влияют на Ценности, они просто указывают на них.

3
ответ дан 30 November 2019 в 06:17
поделиться

В Python все данные хранятся в объектах. Кроме того, имя может быть связано с объектом, после чего это имя может использоваться для поиска этого объекта.

Для объекта не имеет значения, с какими именами, если таковые имеются, он может быть привязан. Он может быть связан с десятками разных имен или ни с одним. Кроме того, в Python нет никаких «обратных ссылок», указывающих от объекта к имени.

Рассмотрим этот пример:

foo = 1
bar = foo
baz = foo

Теперь предположим, что у вас есть целочисленный объект со значением 1, и вы хотите работать в обратном направлении и найти его имя. Что бы вы напечатали? Этот объект связан с тремя разными именами, и все они одинаково действительны.

print(bar is foo) # prints True
print(baz is foo) # prints True

В Python имя - это способ доступа к объекту, поэтому нет возможности работать с именами напрямую. Вы можете искать в различных пространствах имен, пока не найдете имя, связанное с интересующим объектом, но я этого не рекомендую.

Как мне получить строковое представление переменной в Python?

Существует известная презентация под названием «Код как Pythonista», в которой эта ситуация резюмируется как «В других языках есть 'переменные'» и «У Python есть 'имена '"

http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables

2
ответ дан 30 November 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: