Итак, у меня есть этот класс
class table:
h = 0
g = 0
И у меня есть один элемент этого класса под названием aux.
aux = table
Aux.g равен нулю.
Позже я вызываю эту функцию move (aux)
move(x):
newTable = table
newTable.g = x.g + 1
NewTable.g получает 1, как и ожидалось, но x.g также меняется с 0 на 1. Почему?
Заранее спасибо, Адриано
4 ответа
Это потому, что вы объявляете эквивалент переменной статического класса и когда вы обновляете это, он обновляется для каждого экземпляра этого класса. Вам нужно объявить переменные экземпляра следующим образом:
class table:
def __init__(self):
self.h = 0
self.g = 0
Теперь, когда вы создаете экземпляр класса следующим образом: aux = table()
, он присваивает значения этому экземпляру таблицы - просто переменной aux
.
Ваша функция перемещения будет выглядеть так:
move(x):
newTable = table()
newTable.g = x.g + 1
Который будет увеличивать значение newTable.g
, но не значение x.g
. Возможно, вы также захотите вернуть новую таблицу следующим образом: return newTable
, и затем вы сможете использовать ее в других функциях.
Стоит отметить, что в вашем коде вы никогда не выполняете создание экземпляров класса таблицы. Это означает, что когда вы присваиваете aux = table
, он просто присваивает ссылку на класс вашей переменной aux
. Чтобы создать экземпляр класса, вы вызываете класс, как если бы вы были функцией - это называется конструктором - и он вызывает метод __init__
класса. Поэтому, когда я объявляю aux = table()
, выполняется метод table __init__
, а затем возвращается новый экземпляр класса.
Определяя атрибуты только для класса, они привязываются ко всему классу (статическому), а не к отдельным экземплярам (или объектам). То, что вы скорее хотите, это назначить их внутри конструктора:
class Table:
def __init__(self):
self.h = 0
self.g = 0
def move(self, delta):
self.h += deta
Обратите внимание, что я также изменил функцию перемещения на метод. Разница в том, что метод изменяет состояние отдельных экземпляров.
Затем вы можете создавать экземпляры и работать с ними так:
t1 = Table()
t2 = Table()
t1.move(10)
print(t1.h) # will print 10
print(t2.h) # will print 0
h
и g
являются статическими, то есть «переменными класса». h
и g
не являются уникальными для объекта класса table
, но являются атрибутами самого этого класса.
Когда вы сделали это:
aux = table
И это:
newTable = table
Вы не создали новые экземпляры объектов класса table
. Вы просто ссылаетесь на собственный экземпляр класса table
с двумя разными переменными. Короче говоря, aux
и newTable
ссылка (простите меня за это; укажите на ) одно и то же.
Обратите внимание, что h, g
являются общими атрибутами класса table
. Они являются общими для всех экземпляров класса table
.
Похожие вопросы
Связанные вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.