2014-01-04 2 views
0

Если я хочу создать программу, используя Python2.7 где:Передача значения переменной из одного неродственного класса к другому

1) Есть три класса, а именно: Пометка, Комментирование, и отправка

2) В self.content для обоих Tagging и Commenting классы будут отправлены в self.compact класса Posting

class Tagging: # Handles Tagging - Create new Tags 
    def __init__(self): 
     self.content = [] 
     self.initialTag = "" 
    def doTag(self): #Tag people 
     self.initialTag = raw_input("Name to Tag: ") 
     self.content.append(self.initialTag) 
    #Tagging can only be done if the user created new post. 

class Commenting: #Handles Commenting - Create new Comments 
    def __init__(self): 
     self.content = [] 
     self.initialComment = "" 
    def doComment(self): #Commenting on Posts 
     self.initialComment = raw_input("Comment: ") 
     self.content.append(self.initialComment) 
    #Commenting can only be done on Posts. No Post means no Comment. (Same goes to Tags) 

class Posting: #Handles Posting - Create new Posts 
    def __init__(self): 
     self.content = [] #Content of the post 
     self.initialPost = "" 
     self.compact = [] #Post that contains the Post, Comments, and Tags 
     #How do I do this? 

    def doPost(self): 
     self.initialPost = raw_input("Post: ") 
     self.content.append(self.initialPost) 

Я попытался унаследовать class Posting как class Tagging, так и class Commenting, но я думаю, что использование Inheritance только для одного variable из class Posting нелогично.

Может ли кто-нибудь предложить мне лучший способ?

И еще вопрос: являются ли классы Tagging и класс Commenting, имеющие Aggregation отношение к классу Posting? Или это отношения Association? (определение слова UML)

+0

Почему, по вашему мнению, базовый класс для захвата общих понятий между классами плохой концепцией? –

+0

@JoachimRosskopf На самом деле, я думал, если у Python есть встроенная функция для передачи значения переменной. Итак, вы говорите, что наследование - лучший способ подойти к такой проблеме? – Beginner

+0

Почему вы просто не передаете значения через функцию __init__? – Netwave

ответ

0

Как об этом, просто пример кода в «__ главном __» части:

class Tagging: # Handles Tagging - Create new Tags 
    def __init__(self): 
     self.content = [] 
     self.initialTag = "" 
    def doTag(self): #Tag people 
     self.initialTag = raw_input("Name to Tag: ") 
     self.content.append(self.initialTag) 
    #Tagging can only be done if the user created new post. 

class Commenting: #Handles Commenting - Create new Comments 
    def __init__(self): 
     self.content = [] 
     self.initialComment = "" 
    def doComment(self): #Commenting on Posts 
     self.initialComment = raw_input("Comment: ") 
     self.content.append(self.initialComment) 
    #Commenting can only be done on Posts. No Post means no Comment. (Same goes to Tags) 

class Posting: #Handles Posting - Create new Posts 
    def __init__(self, TaggingContent, CommentingContent): 
     self.content = [] #Content of the post 
     self.initialPost = "" 
     self.compact = TaggingContent + CommentingContent #Post that contains the Post, Comments, and Tags 
     #How do I do this? 

    def doPost(self): 
     self.initialPost = raw_input("Post: ") 
     self.content.append(self.initialPost) 

if __name__ == "__main__": 
    T = Tagging() 
    C = Commenting() 
    ##Do stuff here with tagging and commenting.... 
    P = Posting(T.content, C.content) 
    #Do stuff with posting 

Таким образом, у вас есть содержание от Tagging и комментирования в компактный из проводки, или я не прав, что вам нужно?

+0

Это именно то, что мне нужно.Кстати, что делает '__name__ ==" __main __ ":' do? Всегда ли оно возвращает Истину? и еще один вопрос, являются ли эти три класса Агрегационной связью? – Beginner

+0

А что, если у меня есть все три класса в разных файлах Python? Тогда у меня нет выбора, кроме как использовать Наследие, верно? – Beginner

+0

1.- (__ name __ == "__main__") просто проверяет, является ли имя текущего модуля, в котором вы работаете, является «основным» модулем, поэтому, если вы импортируете этот модуль, код в области не будет выполнен , Он просто возвращает true, если вы не импортировали модуль. 2. - Они не являются отношениями с агрегированием, вы просто используете данные из одного класса в другой, у вас нет экземпляра этого класса внутри другого класса. 3. Yo может иметь классы в разных модулях или файлах python и без проблем использовать этот метод. – Netwave

0

Если вы хотите обеспечить в ООП, что набор классов обеспечивает подчинение определенному контракту, вы обычно определяете интерфейс.

Python не предоставляет интерфейсы напрямую, но вместо этого он обычно используют утку-typeing путем использования что-то вроде isinstance или hasattr, что означает, что если ваш объект имеет контент-свойство использовать его, если нет, то поднять ошибка.

Другого Possiblity эмулировать интерфейс доступен, начиная с Python 2.6 с помощью Abstract Base Classes

Надеется, что это помогает.

+0

'isinstance' возвращает TRUE, а не значение переменной. Есть ли другой способ? может думать, что это Inheritance. – Beginner

+0

Нет, я имею в виду, что вы можете проверить, например, проверить с isinstance, если аргумент «Tagging» или «Commenting». Другая возможность - если аргумент hasattr «content» –

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