Как я добавляю свои собственные атрибуты к существующим встроенным типам Python? Как строка? [дубликат]

11
задан Community 23 May 2017 в 12:34
поделиться

7 ответов

Короче говоря, вы не можете. Путь Python - это подкласс String и работа оттуда.

8
ответ дан 3 December 2019 в 01:51
поделиться

Вы этого не сделаете. Используйте отдельные словари для «присоединения» (логически говоря) информации к неизменяемым значениям, таким как строки или числа (строковое или числовое значение как ключ, информация как соответствующее значение в dict).

1
ответ дан 3 December 2019 в 01:51
поделиться

Путь Ruby:

"1".to_i
"1".to_roman 

Путь Python:

int("1")
Roman("1") # or 
Roman.fromstring("1") 

Где Роман будет работать с фиксированным списком встроенных типов или что угодно с методом __ int __ .

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

3
ответ дан 3 December 2019 в 01:51
поделиться

Для этого вы можете создать подкласс str .

Однако, хотя это технически возможно, большую часть времени вы подклассифицируете встроенные функции (например, str ), вы смотрите на отношения типа «имеет-а», а не «есть-а», поэтому следует использовать композицию, а не наследование (это означает, что вы должны создать класс со строкой в ​​качестве атрибута экземпляра, а не со строкой подкласса).

2
ответ дан 3 December 2019 в 01:51
поделиться

Python не поддерживает эту возможность.

0
ответ дан 3 December 2019 в 01:51
поделиться

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

На самом деле, в Python это имеет собственное название: duck-punching.

0
ответ дан 3 December 2019 в 01:51
поделиться

В CPython вы можете использовать ctypes для доступа к C-API интерпретатора, таким образом вы можете изменять встроенные типы во время выполнения.

import ctypes as c


class PyObject_HEAD(c.Structure):
    _fields_ = [
        ('HEAD', c.c_ubyte * (object.__basicsize__ -
                              c.sizeof(c.c_void_p))),
        ('ob_type', c.c_void_p)
    ]

_get_dict = c.pythonapi._PyObject_GetDictPtr
_get_dict.restype = c.POINTER(c.py_object)
_get_dict.argtypes = [c.py_object]

def get_dict(object):
    return _get_dict(object).contents.value

def my_method(self):
    print 'tada'
get_dict(str)['my_method'] = my_method

print ''.my_method()

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

21
ответ дан 3 December 2019 в 01:51
поделиться
Другие вопросы по тегам:

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