Из ваших последних изменений я подозреваю, что вам не хватает оснований того, как работают классы на Python. Вы можете прочитать the tutorial chapter или, возможно, искать более дружелюбный/более подробный учебник.
В частности:
Я хотел бы объединить некоторые функции в классе, используя схему, показанную ниже. Метод1 создает экземпляр 'a' класса1, который мне бы хотелось использовать в других методах myClass. Я попытался использовать переменную класса, которую я установил для экземпляра класса1, но это не работает.
Это не способ сделать это. Атрибуты класса, такие как ваши class_variable
, создаются во время создания класса (то есть, как правило, как только вы import
модуль или запустите сценарий), а не время создания экземпляра. Если вы хотите создать что-то, когда созданы экземпляры вашего класса, вы используете атрибуты экземпляра, а не атрибуты класса, и вы установили их в методе __init__
.В вашем случае вам не нужен экземпляр, созданный до вызова Method1
экземпляра, что означает, что вы используете атрибут экземпляра; вы просто делаете это внутри Method1
, а не __init__
.
Кроме того, атрибуты класса разделяются всеми экземплярами класса; атрибуты экземпляра, каждый экземпляр имеет свой собственный. Вещь о собаках: у каждой собаки есть собственный хвост, у всех собак нет одного хвоста, поэтому tail
является атрибутом экземпляра. Часто в простых сценариях вы не замечаете разницы, потому что вы только когда-либо создаете один экземпляр класса. Но если вы не можете понять разницу практически, подумайте об этом концептуально (например, пример Dog
), и если вы все еще не можете понять это, вы почти всегда хотите атрибут экземпляра.
Ссылка на переменную класса с использованием имени класса, например myClass.variable.somemethod, из класса 1, но я получаю ошибку «Ссылка на объект, не установленную на экземпляр объекта».
Скорее всего, это происходит потому, что class1
является COM/Interop или классов .NET, и вы пытаетесь создать и использовать его, прежде чем делать какие-либо из соответствующей установки, которая происходит только потому, что вы пытаетесь сделайте это, как только вы import
модуль/запустите скрипт. Если это так, если вы создаете его, когда на самом деле намеревались, проблем не будет.
Каков наилучший подход, чтобы все методы myClass могли иметь доступ к?
Создать атрибут экземпляра в Method1
, как это:
def Method1(self, argument list):
# this method instantiates a
...
self.a = class1()
И затем использовать его таким же образом:
def Method2 (self):
...
self.a.class1method1()
...
Просто делать a = whatever
только создает локальную переменную, которая уходит в конец метода. Даже если это имеет то же имя, что и атрибут класса, атрибут экземпляра или глобальный, вы все еще создаете новую локальную переменную, не изменяя вещь, которую хотите изменить. В отличие от некоторых других языков, Python требует, чтобы вы явно указывали на то, что вы пытаетесь переписать, для атрибута экземпляра, myClass.a
для атрибута класса и т. Д., Поэтому вы не делаете это случайно.
Также обратите внимание на круглые скобки в конце этого последнего выражения. Если вы хотите вызвать функцию или метод, вам нужны скобки; в противном случае вы просто ссылаетесь на этот метод как значение.
В конце концов, я хотел бы назвать MyClass из другого модуля.
Я не уверен, что вы подразумеваете под словом "class myClass". Когда вы вызываете класс, он создает новый экземпляр класса. Затем вы можете вызвать методы этого экземпляра так же, как и любой другой объект. Неважно, какой модуль он был определен (за исключением того, что вам, очевидно, нужно писать my_instance = mymodule.MyClass()
).
Посмотрите, как вы используете стандартную библиотеку; это точно то же самое. Например, если вы import csv
, вы можете построить DictWriter
, написав my_writer = csv.DictWriter(my_file)
. И затем вы вызываете его методы, написав my_writer.writerow(my_row)
.Как только вы его построили, неважно, из какого модуля он исходил.
еще одно:
Вы пытались определить класс, как это:
myClass:
Вы, очевидно, не может сделать это; вам нужно ключевое слово class
. Но также, в Python 2.x, вы всегда хотите дать базовые классы, используя object
, если вам больше ничего не нужно. В противном случае вы получаете класс старого стиля, который вызывает всевозможные странные причуды и ограничения, которые вы не хотите изучать и которые нужно отлаживать. Итак:
class myClass(object):
Является ли это синтаксисом IronPython и C#, с которым вы пытаетесь соответствовать? Или что-то другое? – abarnert
@abarnert Я стараюсь соответствовать VB. – cjbust
Спасибо. В общем, это помогает помещать эту информацию в вопрос - и, тем более, для того, чтобы поместить ссылку туда, откуда поступает информация. В этом случае ничто из этого не может быть связано с вашей проблемой, но это никогда не повредит. – abarnert