Как я могу сделать список, определенный в одном методе, доступным в другом методе, когда оба метода находятся в одном классе?

#python #methods

Вопрос:

У меня есть two methods within the same class , и я хочу сделать list один метод доступным в другом методе, как мне это сделать?

Вот мой код:

 class Solution:
    primes=[]

    def primeNumber(self,n):
        numbers = set(range(n, 1, -1))
        self.primes = []
        while numbers:
            p = numbers.pop()
            self.primes.append(p)
            numbers.difference_update(set(range(p * 2, n   1, p)))

    def goodNumbers(self,f):
        self.primes.append(f)
        return self.primes

x=Solution()
print(x.primeNumber(100)) ##populate the list
print(x.goodNumbers(123456789)) ##return the list as populated by previous call, and with the long number appended
 

По какой — то причине self.primes не учитывает длинное число, добавленное в goodNumbers () — есть идеи, почему это так?

Комментарии:

1. одним из быстрых способов было бы self.primes = [] сделать все primes , чтобы self.primes

2. Любой учебник по Python расскажет об этом в разделе, посвященном классам.

Ответ №1:

Как уже было сказано, вы можете использовать переменную экземпляра self.primes вместо локальной переменной primes . Это полезно, если вы планируете повторно использовать значения.

Если вместо этого вы просто хотите использовать значения один раз и хотите goodNumbers позвонить primeNumber , то просто добавьте return primes в конце primeNumber (вне while цикла, конечно)

Редактировать

Поскольку вопрос был изменен:

Я только что видел ваш отредактированный вопрос. Это не сработает: если вы используете self.primes для передачи данных между методами, вам нужно сначала создать их, вероятно , во время инициализации объекта, затем заполнить их вызовом primeNumber , а затем вы можете прочитать/изменить их goodNumbers .

Например:

 class Solution:
    primes=[]

    def primeNumber(self,n):
        numbers = set(range(n, 1, -1))
        self.primes = []
        while numbers:
            p = numbers.pop()
            self.primes.append(p)
            numbers.difference_update(set(range(p * 2, n   1, p)))

    def goodNumbers(self,n):
        self.primes.append(7598347534)
        return self.primes

x=Solution
x.primeNumber(100) ##populate the list
x.goodNumbers(123456789) ##return the list as populated by previous call, and with the long number appended
 

Комментарии:

1. Спасибо gimix — один вопрос, если я определю self.простые числа, скажем, в первом методе, должен ли я вернуть его, чтобы вызвать его в другом методе? В противном случае, как я могу использовать self.primes в другом методе?

2. self.primes является атрибутом объекта и напрямую доступен каждому методу (а также за пределами объекта: если вызывается ваш экземпляр Solution x , то x.primes он предоставляет вам список). Поэтому, как только primeNumber вы напишете self.primes , вы просто получите доступ к нему goodNumbers или любым другим методам, как self.primes

3. Спасибо, Джимикс, в последний раз, пожалуйста, — я отредактировал вопрос. Почему x.primeNumber(100) не возвращает None? Но x.goodNumbers(123456789) работает просто отлично, он печатает список простых чисел до 100, а затем добавляет 123456789.

4. Извините, я пропустил скобки, все x=Solution() так, как вы сказали. Он ничего не печатает, потому что у вас больше нет print() вызова — он возвращает список: попробуйте y = x.goodNumbers(123456789) или просто print(x.goodNumbers(123456789))

5. Привет, Гимикс, извините за последний вопрос, действительно ли нам нужны простые числа = [] внутри класса? Потому что, когда я опускаю это, все по-прежнему работает, и для меня не имеет смысла, почему это происходит, потому что кажется, что мы просто переопределяем это в наших методах?

Ответ №2:

вы можете добавить список в качестве переменной, в которую вы можете передавать данные: например

 def goodNumbers(self,n,primes = [] ):
    newprime = ( get the next prime number )
    if not newprime in primes:
        primes.append( newprime )
    return primes

primes = [2, 3, 5, 7, 11, 13, 17, 19]
goodnumbers( n, primes )