Python: Как объявить объект класса из другого объекта, который также является переменным в этом классе? - PullRequest
0 голосов
/ 13 октября 2018
class Apple:
    def print_my_tree_name(self):
        print('I want to use name of Tree on which I\'m hanging')


class Tree:
    def __init__(self, name):
        self.name = name
        self.apple = Apple()


a = Tree('test')
a.apple.print_my_tree_name()

Можно ли получить доступ к переменной name, не передавая себя в класс Apple, например a.apple.print_my_tree_name()?

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

Я не уверен, почему вы хотите получить доступ к name в классе Apple, но если бы мне пришлось это сделать, я реализовал бы что-то, как показано ниже

class Tree:
    def __init__(self, name):
        self.name = name

class Apple:
    def __init__(self, name):
        self.tree = Tree(name)

    def print_my_tree_name(self):
        print('I want to use %s'%self.tree.name)


a = Tree('test')
a.print_my_tree_name()

Смотрите композицию в python, это то, что вынужно в принципе.http://blog.thedigitalcatonline.com/blog/2014/08/20/python-3-oop-part-3-delegation-composition-and-inheritance/

0 голосов
/ 13 октября 2018

Возможно, что-то вроде этого, используя @staticmethod

class Tree:
    def __init__(self, name):
        self.name = name
        self.apple = Apple()

class Apple():

    @staticmethod
    def print_my_tree_name():
        print(f'Hanging on {a.name} tree.')

a = Tree('test')
a.apple.print_my_tree_name()
# Hanging on test tree.
0 голосов
/ 13 октября 2018

Вы можете указать имя дерева как атрибут яблока в конструкторе дерева

class Apple:
    def print_my_tree_name(self):
        print('I am hanging on tree: %s'%self.tree_name)


class Tree:
    def __init__(self, name):
        self.name = name
        self.apple = Apple()
        self.apple.tree_name = name


a = Tree('test')
a.apple.print_my_tree_name()
...