РЕДАКТИРОВАТЬ
Обратите внимание, что мое внимание было обращено на то, что Атрибут экземпляра attribute_name, определенный вне __init__, является возможным дубликатом, с которым я в основном согласен (я не не наткнулся на это, потому что я не знал, что нужно искать pylint). Однако я хотел бы оставить этот вопрос открытым из-за того, что я хочу иметь возможность повторно инициализировать свой класс, используя тот же метод. Общий консенсус в предыдущем вопросе заключался в том, чтобы вернуть каждый параметр из сценария loadData
, а затем проанализировать его в объекте self. Это нормально, однако мне все равно придется сделать это снова в другом методе, чтобы иметь возможность повторно инициализировать мой экземпляр класса, что все еще кажется дополнительной работой только для немного большей читабельности. Возможно, дело в моем примере. В реальной жизни процедура loadData
считывает около 30 параметров, поэтому я не решаюсь анализировать их в двух разных местах.
Если общий консенсус здесь заключается в том, что возврат параметров - это путь, тогда мы можем пойти дальше и закрыть этот вопрос как дубликат; однако тем временем я хотел бы подождать, чтобы узнать, есть ли у кого-нибудь еще какие-либо идеи/хорошее объяснение, почему.
Оригинал
Это что-то вроде вопроса о "лучших практиках". В последнее время я изучаю python (частично, чтобы узнать что-то новое и частично, чтобы уйти от MATLAB). Работая в python, я создал класс, который был структурирован следующим образом:
class exampleClass:
"""
This is an example class to demonstrate my question to stack exchange
"""
def __init__( self, fileName ):
exampleClass.loadData( self, fileName )
def loadData( self, fileName ):
"""
This function reads the data specified in the fileName into the
current instance of exampleClass.
:param fileName: The file that the data is to be loaded from
"""
with open(fileName,'r') as sumFile:
self.name = sumFile.readLine().strip(' \n\r\t')
Теперь это имеет смысл для меня. У меня есть класс инициализации, который заполняет текущий экземпляр класса, вызывая функцию заполнения. У меня также есть функция заполнения, которая позволила бы мне повторно инициализировать данный экземпляр этого класса, если по какой-то причине мне это нужно (например, если класс занимает много памяти и вместо создания отдельных экземпляров класса я просто хочу есть один экземпляр, который я перезаписываю.
Однако, когда я помещаю этот код в свою IDE (pycharm), он выдает предупреждение о том, что атрибут экземпляра был определен за пределами __init__
. Теперь очевидно, что это не влияет на работу кода, все работает нормально, но мне интересно, есть ли смысл обращать внимание на предупреждение в этом случае. Я мог бы сделать что-то, где я инициализирую все свойства некоторым значением по умолчанию в методе init перед вызовом loadData method
, но это просто кажется мне ненужной работой и замедлит выполнение (хотя и очень небольшое количество). Я также мог бы иметь по существу две копии метода loadData, одну в методе __init__
и одну в качестве фактического метода, но опять же это просто кажется ненужной дополнительной работой.
В целом мой вопрос заключается в том, что было бы наилучшей практикой в этой ситуации. Есть ли какая-то причина, по которой мне следует реструктурировать код одним из способов, упомянутых в предыдущем абзаце, или это просто экземпляр IDE со слишком широким предупреждением о проверке кода. Я, очевидно, вижу некоторые случаи, когда это предупреждение нужно учитывать, но, исходя из моего текущего опыта, в этом случае это не похоже на проблему.
self.name = self.loadData(...)
и вернуть данные изloadData
- person Peter Wood   schedule 16.11.2015