2015-11-24 7 views
0

У меня есть следующий код и любая попытка сделать класс, который генерирует два случайных чисел в виде списка и возвращает ихпитона класс сами и __init__

import random 

class add : 

    def __init__(self): 
     self.data = [] 

    def GenerateLocation(self): 
     random1 = 10 
     random2 = 20 
     self.data.append(random.uniform(-random1 , random1)) 
     self.data.append(random.uniform(-random2 , random2)) 
     print(self.data) 

self.data.GenerateLocation(self) 

Я получаю ошибку self is not defined in line 15 self.data.GenerateLocation(self).

Может кто-нибудь объяснить это, я смотрю на другие вопросы о себе и инициализации, но это над моей головой.

+0

Посмотрите на отступ в коде. Отступы * важны * в коде Python. Последняя строка в вашем коде * не является частью какого-либо метода *. –

+0

У вас будут другие ошибки при исправлении этой части, потому что на 'self.data' нет метода' GenerateLocation() ', который является объектом списка. –

+0

self.data.GenerateLocation (self) находится в основной части программы, вы не можете вызывать методы из основного или что-то еще? – Broomer

ответ

3

Я думаю, что вы пытаетесь сделать это:

import random 

class Add: 

    def __init__(self): 
     self.data = [] 

    def generate_location(self): 
     random1 = 10 
     random2 = 20 
     self.data.append(random.uniform(-random1 , random1)) 
     self.data.append(random.uniform(-random2 , random2)) 
     print(self.data) 

my_object = Add() 
my_object.generate_location() 

Чтобы использовать класс, вы должны создать объект/экземпляр. Создание экземпляра python вызывает Add.__init__ и резервирует место в памяти для self.data. Затем вы можете вызвать его метод my_object.generate_location() и он может использовать self.data.

self используется только внутри класса - это как слова me, my (my.data).

+0

Да, именно так, как предполагается, вы можете объяснить, почему приведенный выше код является правильным, не имея никакого _init__ или self и вызывающего его, используя имя класса, например Add.generate_location() – Broomer

1

Линия self.data.GenerateLocation(self) действительно странная, и неясно, что вы пытаетесь сделать здесь. Если вы создаете класс, кажется, что вы хотите его создать, т. Е. Создать объект этого класса. Для этого вам нужно вызвать конструктор. В вашем случае это будет похоже (копирование с @ ответ furas'S)

my_object = Add() 

Это создает объект my_object, который является экземпляром класса Add. Затем вы можете вызвать метод generate_location вашего объекта. Для этого вам необходимо добавить generate_location() с именем вашего объекта.

my_object.generate_location() 

Обратите внимание, что, несмотря на то, что generate_location имеет аргумент self, он не задается явно в этом вызове. Это связано с тем, что Python будет передавать (ссылку на) объект my_object методу generate_location в качестве первого аргумента автоматически только потому, что он является методом этого объекта. (Методы - это функции, связанные с объектами, например .append() для списков.)

Для получения более подробной информации см. Официальное руководство: python 2, python 3.