2015-12-14 2 views
-1

Я новичок в создании класса в python. Но у меня странное поведение на версии 2.7. . Нет проблем на 2.7.8 или 2.7.1 или 3, только на 2.7.странное поведение с атрибутом в классе в python 2.7.5

Я получил эту ошибку, когда он пытался использовать мой класс

# ./script_testing.py 
Linux 
('CentOS Linux', '7.1.1503', 'Core') 
Traceback (most recent call last): 
    File "./script_testing.py", line 1204, in <module> 
    print(x.DIST) 
AttributeError: WhatsName instance has no attribute 'DIST' 

Мой код:

import platform 

class WhatsName(): 
    """Distributive version checking and soft installing""" 
    def __init__(self): 

     self.PLAT=platform.system() 
     self.DISTRIB=platform.linux_distribution() 

     if self.PLAT=='Linux' or self.PLAT=='Linux2': 
      if self.DISTRIB[0]=='debian': 
       self.DIST='Debian' 
      elif self.DISTRIB[0]=='Ubuntu': 
       self.DIST='Ubuntu' 
      elif self.DISTRIB[0]=='CentOS': 
       self.DIST='Centos' 
      elif self.DISTRIB[0]=='Fedora': 
       self.DIST='Fedora' 
      elif 'SUSE' in self.DISTRIB[0]: 
       self.DIST='Suse' 
      elif self.DISTRIB[0]=='Slackware': 
       self.DIST='Slackware' 
      else: 
       pass 
     elif self.PLAT=='FreeBSD': 
      self.DIST='FreeBSD' 
     elif PLAT=='Windows': 
      self.DIST='Windows' 
     elif PLAT=='Darwin': 
      self.DIST='MacOS' 
     else: 
      self.DIST='Unknown' 

    def CheckSystem(self): 
     pass 

    def InstallSoft(self,x,y): 
     pass 


x=WhatsName() 
print(x.PLAT) 
print(x.DISTRIB) 
print(x.DIST)  <== This string generates the error 

Таким образом, я не понимаю, почему DIST не является атрибутом класс WhatsName. И почему это происходит только на версии 2.7.5

На других версиях я получаю нормальный результат:

"script_testing.py" 1233L, 26872C записано 
:!python2.7 script_testing.py 
Linux 
('debian', '7.1', '') 
Debian 
+3

Посмотрите внимательно * на трассе *. Это не трассировка, создаваемая кодом, который вы показываете. –

+1

В вашей трассе есть строка 'print (WhatsName.DIST)'. Введенный вами код использует 'print (x.DIST)'. * Класс * не имеет такого атрибута, только * экземпляр * делает. –

+0

Простите меня, но я не понимаю, где ошибка в моем коде. Почему печать (x.PLAT) и печать (x.DISTRIB) работают хорошо? Какая разница? И почему этот код хорошо работает с любой другой версией, кроме 2.7.5? –

ответ

0

Ни один из ваших if утверждений не соответствует первое значение self.DISTRIB:

('CentOS Linux', '7.1.1503', 'Core') 

Строка 'CentOS Linux', но вы не проверяете эту строку, поэтому self.DIST никогда не устанавливается.

Вы только тест для строки 'CentOS':

elif self.DISTRIB[0]=='CentOS': 
    self.DIST='Centos' 

Эта строка никогда не соответствует, ни делать другие тесты в этом if...elif... заявлении. Поскольку у вас нет else здесь, чтобы установить self.DIST, вы получите ошибку атрибута в конце.

Вы можете просто исправить эту строку:

elif self.DISTRIB[0]=='CentOS Linux': 
    self.DIST='Centos' 

Я бы также установить self.DIST = 'Unknown'в начале, поэтому у вас есть значение по умолчанию, то есть свой набор из if ветвей определить более точное значение.

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