Установите атрибут для всех экземпляров класса в условиях - PullRequest
0 голосов
/ 14 сентября 2018

Прежде всего, извините за мое невежество, если это довольно простой вопрос. Чего я хотел бы добиться, так это создать атрибут для каждого экземпляра класса (например, filepath), изменить его для экземпляра (т.е. в первом случае, где я изменяю значение filepath для a экземпляр, но если я создаю новый экземпляр, например, b, я бы хотел сохранить исходное значение filepath.

filepath = '/path/to/original/file'

class A(object):


    @classmethod
    def _set_path(cls, filepath):
        cls.filepath = filepath
        return cls.filepath

    def __init__(self, name):
        self.name = name

A._set_path(filepath) # Set filepath for all instances: /path/to/original/file

a = A("Alice")
print(a.filepath)
a._set_path("/path/to/another/file") # Set filepath for instance a, but also for every new instance. This is what needs to be corrected.
print(a.filepath)

b = A("Bob")
print(b.filepath) # I would like to keep /path/to/original/file

Есть ли способ улучшить этот код и / или иметь шаблон интеллектуального дизайна для этого случая?

1 Ответ

0 голосов
/ 15 сентября 2018

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

class A:
    filepath = None
    def __init__(self, name):
        self.name = name

A.filepath = "/path/to/original/file"
a = A("Alice")
print(a.filepath)
a.filepath = "/path/to/another/file"
print(a.filepath)

b = A("Bob")
print(b.filepath)

Определение класса A (примечание: в python 3 все классы выполнены в новом стиле, и я предполагаю, что наследование от object предназначалось для защиты привычек Python 2), мыопределить атрибут класса filepath.Строго говоря, в этом нет необходимости, но если это предназначенная часть интерфейса ... Конечно, вы также можете указать первое начальное значение по умолчанию непосредственно в определении класса.

Затем мы присваиваем наше первое значение '/path/to/original/file' к этому.В этот момент мы создаем экземпляр a класса A, и когда мы получаем доступ к его атрибуту filepath, мы получаем значение атрибута класса.Затем мы присваиваем другое значение атрибуту экземпляра (a.filepath) и, снова обращаясь к нему, получаем его значение обратно, пока мы не изменили атрибут класса A.filepath, который мы также видим для вновь созданного экземпляра b.

Но будьте осторожны, смешивая назначения для атрибутов класса и экземпляра (с одним и тем же именем, может вызвать путаницу и, возможно, непреднамеренное поведение. Учтите это:

A.filepath = "/path/to/original/file"
a = A("Alice")
a.filepath = "/path/to/another/file"
b = A("Bob")  # b.filepath is "/path/to/original/file"
A.filepath = "/third/file"
c = A("Carl")

Теперь доступ к a.filepath дает "/path/to/another/file", но для b.filepath и c.filepath есть "/ third / file", что может или не может быть тем, что мы хотели, особенно для b.filepath.

Следовательно, для аналогичного варианта использованияЯ бы предпочел что-то вроде:

class A:
    default_filepath = "/path/to/original/file"
    def __init__(self, name):
        self.filepath = self.default_filepath
        self.name = name

a = A("Alice")
a.filepath = "/path/to/another/file"
b = A("Bob")
A.default_filepath = "/third/file"
c = A("Carl")

Класс имеет атрибут default_filepath, который используется для присвоения каждому экземпляру атрибута self.filepath. Это должно помочь уменьшить риск ошибок. В приведенном выше примере это:

a.filepath
b.filepath
c.filepath

Теперь имеют значения:

/path/to/another/file
/path/to/original/file
/third/file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...