2016-05-20 4 views
2

Простого определение класса withh подклассы, чтобы показать уделИнстанцирование подкласса питона

import datetime 

class LibaryItem:  #The base class definition 
    def __init__(self, t, a, i): # initialiser method 
     self.__Title = t 
     self.__Author_Artist = a 
     self.__ItemID = i 
     self.__OnLoan = False 
     self.DueDate = datetime.date.today() 

    def GetTitle(self): 
     return(self.__Title) 
# All other Get methods go here 

    def Borrowing(self): 
     self.__OnLoan = True 
     self.__DueDate = self.__DueDate + datetime.timedelta(weeks = 3) 
    def Returning(self): 
     self.OnLoan = False 
    def PrintDetails(self): 
     print(self.__Title, '; ', self.__Author_Artist,'; ',end='') # end='' Appends a space instead of a newline 
     print(self.__ItemID, '; ', self.__OnLoan,'; ', self.__DueDate) 

class Book(LibaryItem):# A subclass definition 
    def __init__(self, t, a, i): # Initialiser method 
     LibaryItem.__init__(self, t, a, i) 
     # This statement calls the constructor for the base class 

     self.__IsRequested = False 
     self.__RequestBy = 0 
    def GetIsRequested(self): 
     return(self.__IsRequested) 
class CD(LibaryItem): 
    def __init__(self, t, a, i): # Initialiser method 
     LibaryItem.__init__(self, t, a, i) 
     self.__Genre = "" 
    def GetGenre(self): 
     return(self.__Genre) 
    def SetGenre(self, g): 
     self.__Genre = g 

Инстанцирования подкласса

ThisBook = Book('Title', 'Author', 'ItemID') 

ThisCD = CD('Title', 'Author', 'ItemID') 

Это моя проблема здесь я не понимаю, почему ThisBook атрибут объекта не изменяется от False по умолчанию до True.

# Using A method 
print(ThisBook.GetIsRequested()) 

ThisBook.IsRequested = True 
print(ThisBook.GetIsRequested()) 

Спасибо вам причину, почему это не работает будет полезно

+3

Пожалуйста, не начинайте имена переменных и методов с большой буквы. Это очень необычно, и ваш код трудно читать. –

ответ

2

вероятно Вы имели в виду, чтобы сделать

ThisBook.__IsRequested = True 

, которые вы не можете сделать из-за name mangling. Вы могли бы написать еще один сеттер.

Но прежде чем вы слишком глубоко погрузитесь в писание множества геттеров и сеттеров, вы должны знать, что питонический путь - не использовать их. Или, если требуется дополнительная логика, используйте @property decorator.

class LibaryItem: 
    def __init__(self, title, author, itemid): # initialiser method 
     self.title = title 
     self.author = author 
     self.itemid = itemid 
     self._onloan = False 
     self.duedate = datetime.date.today() 

    @property 
    def onloan(self): 
     return self._onloan 

    @onloan.setter 
    def onloan(self, value): 
     if value: 
      self.duedate += datetime.timedelta(weeks = 3) 
     self._onloan = value 

    def __str__(self): 
     return "%s; %s; %s; %s; %s" % (self.title, self.author, self.itemid, self.onloan, self.duedate) 

class Book(LibaryItem): 
    def __init__(self, title, author, itemid): 
     LibaryItem.__init__(self, title, author, itemid) 
     self.requested = False 
     self.requestby = 0 

, а затем

ThisBook = Book('Title', 'Author', 'ItemID') 
print(ThisBook.requested) 
ThisBook.requested = True 
ThisBook.onloan = True 
print(ThisBook.duedate) 
+0

Это не сработает; Python управляет любым именем участника, начинающимся с '__', таким образом, что он не может быть доступен с этим именем кодом вне области класса. В этом случае он становится '_Book__IsRequested'. –

+0

Нет, это не сработает, потому что __ делает изрубленное имя. –

+0

Правильно, я пропустил это. Я скорректировал свой ответ, чтобы отразить это. –

1

Вы не можете получить доступ поле с 2 подчеркивает префикс подобное (см What is the meaning of a single- and a double-underscore before an object name?). Вы должны написать правильный сеттер:

def SetIsRequested(self, val): 
    self.__IsRequested = val 

То, что вы испытываете является типичной глупостью динамических языков. Поле на классе может быть указано w/o объявлено, и интерпретатор не сможет помочь вам, указав, что вы только что создали новое поле под названием «IsRequested» в вашем классе. Сохраняет некоторые типизации, но стоит вам в способности вашего переводчика и IDE, чтобы вы не испортились.

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

  • Нет связанных вопросов^_^