2015-05-20 3 views
0

здесь является частью моего кода:Сложности с повторным использованием переменной

class projet(object): 

    def nameCouche(self): 

     valLissage = float(ui.valLissage.displayText())  
     return (valLissage)   
    valCouche = nameCouche() # asks for a positional argument but 'self' doesnt work 

    def choixTraitement(self): 
     ui.okLissage.clicked.connect(p.goLissage) 

    def goLissage(self, valCouche): 
     if ui.chkboxLissage.isChecked(): 
      print(valCouche) # result is False 
      os.system(r'"C:\Program Files\FME\fme.exe" D:\Stelios\..... --MAX_NUM_POINTS {0}'.format(valCouche)) 

Так что я хотел бы использовать valCouche в goLissage метод, но он не работает. Я думал, что valCouche будет иметь аргумент valLissage, но вместо этого он дает значение False. Я пробовал разные варианты, но все равно не работает.

+0

OT, но в любом случае: 1. ваше имя класса должно быть заглавным («Projet», а не «projet»), 2.«ui» должен быть атрибутом (передан методу '__init __()'), а не глобальным, 3. команда, вызываемая 'os.system()', и ее аргументы не должны быть жестко закодированы (либо сделать их настройки, либо пройти их в '' __init __() ') вашего класса. Ну, если вы ожидаете, что ваш код будет поддерживаемым, то есть ... –

+0

Спасибо. 1- Я капитализировал «Projet». 2- «ui» - это класс Ui_Interface() 3, он не будет жестко запрограммирован, когда я закончу, но я все еще в раннем процессе. – guy16

+0

Вы говорите: «ui» - это класс Ui_Interface() », который FWIW предлагает, что это экземпляр этого класса, но в любом случае: класс, экземпляр или модуль, это все еще объект, но это не главное ... Дело в том, что быть в состоянии подставить любое «ui» с любым другим объектом, имеющим один и тот же интерфейс. Правильная развязка делает проверяемый и поддерживаемый код. –

ответ

0

Вы должны объявить variabile в __init__ метода (конструктор), а затем использовать его в коде

например:

class projet(object): 
    def __init__(self): 
     self.valCouche = '' 

    def nameCouche(self): 
     valLissage = float(ui.valLissage.displayText())  
     return (valLissage)   


    def choixTraitement(self): 
     ui.okLissage.clicked.connect(p.goLissage) 

    def goLissage(self, valCouche): 
     if ui.chkboxLissage.isChecked(): 
      self.valCouche = self.nameCouche() 
      print(self.valCouche) # result is False 
      os.system(r'"C:\Program Files\FME\fme.exe" D:\Stelios\..... --MAX_NUM_POINTS {0}'.format(self.valCouche)) 
+1

Нет, вам не нужно объявлять переменные в '__init__'; вы можете добавить новый атрибут в другое место так же легко, как вы можете добавить его там. – abarnert

+1

@abarnert: вы технически правы, но это хорошая практика «объявить» (ну, инициализировать, по крайней мере, значение по умолчанию) ожидаемых атрибутов экземпляра в '__init __()'. –

+0

Я думаю, вы почти правы. Беда в том, что вы не можете использовать 'valCouche' как функцию-указатель на' nameCouche() ', потому что объект и, следовательно,' self' не существуют в точке объявления класса (если это была переменная класса, подобная в коде OPs). Объявление 'self.valCouche' в' __init__' имеет смысл, потому что 'self.valCouche' является указателем на функцию объекта. Однако это должно быть 'self.valCouche = self.nameCouche', чтобы следовать примеру OP примера –

-1

вы должны определить функцию инициализации: def__init __ (Self) , определяющий valCouche как атрибут экземпляра делает его доступным для всего метода, поэтому мы имеем следующие

class projet(object): 

    def __init__(self): 
     self.valCouche = '' 

    def nameCouche(self): 
     self.valCouche = float(ui.valLissage.displayText()) 

    @staticmethod #here there is no need for self so it is a method of class 
    def choixTraitement(): 
     ui.okLissage.clicked.connect(p.goLissage) 

    def goLissage(self): 
     if ui.chkboxLissage.isChecked(): 
      print(self.valCouche) # result is False 
      os.system(r'"C:\Program Files\FME\fme.exe" D:\Stelios\..... --MAX_NUM_POINTS {0}'.format(self.valCouche)) 
+0

Лучше всего объяснить свой код, чтобы ассер понял ваш ответ. – SuperBiasedMan

3

У вас есть несколько здесь проблемы.

Во-первых, если вы пишете это в середине определения класса:

valCouche = nameCouche() 

... вы создаете атрибут класса, который является общим для всех случаев, а не обычный атрибут экземпляра.

Кроме того, вы запускаете это при определении времени определения класса. Это значит, что is no self еще нет. Есть еще нет примеров self - так вы не можете назвать метод nameCouche, потому что вам нечего называть его.

То, что вы хотите сделать, это вызвать метод во время инициализации экземпляра к экземпляру инициализации и хранения возвращаемого значения в атрибуте например:

def __init__(self): 
    self.valCouche = self.nameCouche() 

Затем, когда вы хотите, чтобы получить это значение, в другом методе позже вы должны получить к нему доступ как self.valCouche.


Если вы сделаете эти изменения, то это будет работа. Но ваша объектная модель все еще не имеет большого смысла. Почему nameCouche метод, когда он не имеет никакого отношения к объекту и не имеет доступа к каким-либо его атрибутам? Возможно, это имеет смысл как @staticmethod, но на самом деле, я думаю, что это имеет смысл, как простая функция вне класса. Фактически, нет кода, который вы написали, похоже, имеет какое-либо отношение к классу.

Этот вид дизайна cram-everything-in-class часто является признаком того, что вы пытаетесь написать Java-код в Python и еще не поняли, как Python делает OO. Возможно, вы захотите прочитать хороший учебник по классам Python. Но кратко: если вы пишете класс, просто чтобы где-то свалить кучу неопределенных функций, вам нужен модуль, а не класс. Если у вас есть причина иметь экземпляры этого класса, а все функции действуют на данные каждого экземпляра, то вам нужен класс.

+0

Я думаю, что valCouche должен быть указателем на функцию, потому что OP хочет проверить 'displayText()', который, как я полагаю, является динамическим, –

+0

P.R. является правильным. @abarnert благодарю вас за ответ. Я изменю некоторые вещи. Но вот я только что положил маленький кусочек своего кода, возможно, поэтому он выглядит странно и не делает muche смысл. Я определенно не эксперт Python. Я думаю, что мне нужны классы, но я буду ближе смотреть на «модули». – guy16

+0

@ P.R .: Это не имеет никакого смысла. Он выполняет 'valCouche = nameCouche()' в своем запрошенном коде, то есть он пытается _call_ метод, а не просто ссылается на него. И он никогда не пытается называть 'valCouche' позже; единственное, что он делает с этим, - это «распечатать» его, что необычно для объекта метода. – abarnert

Смежные вопросы