Возвращает определенные функции класса из другой функции

#python #oop

Вопрос:

У меня есть 2 класса, A и B

 class A:   def name(self):  return B(name=self)  class B:   def __init__(self, name):  self.name = name   def hi(self):  return "Hi!"   self.name   def bye(self):  return "Bye!"   self.name   print(A.name('Robert').hi()) print(A.name('Robert').bye()) # I don't want this :(  

Это распечатывается Hi! Robert , и Bye! Robert , однако, класс A имеет доступ к bye() (чего я не хочу). Есть ли способ ограничить функции B, которые A.name может получить доступ?

Комментарии:

1. Правильное использование ООП — это A('Robert').name() и дать __init__

2. Вы утверждаете, что «класс А имеет доступ к bye()». Это не так. Скорее, по причинам, которых я не понимаю, вы реализовали A.name() метод для возврата экземпляра B, и этот экземпляр B (конечно) имеет доступ к методам своего собственного класса. Почему это A.name() возврат нового экземпляра B? Это ключевой вопрос. Возможно, если вы объясните, почему вы реализовали это таким образом, вы получите более полезную помощь в ответ.

3. Мне жаль, что я неправильно объяснил свой вопрос, на самом деле у A есть еще много функций, и у B. Каждая из функций A использует разные функции B. Следовательно, я не могу использовать init, потому что я хочу передать значение отдельным функциям. A.name() возвращает экземпляр B, так как мне нужен способ для конечного пользователя/программиста использовать несколько функций B при передаче значения через функцию A. Поэтому мой вопрос заключался в том, может ли функция A возвращать только определенные функции B вместо всех.

Ответ №1:

Это противоречило бы системе набора текста Python.

В языках со статической типизацией тип имеет не только объект данных в памяти, но и переменная, которая ссылается на него, и два типа не обязательно должны быть идентичными (хотя они должны совпадать). Члены класса, доступные через ссылочную переменную, обычно зависят от типа переменной, а не от типа объекта.

Python-это динамически типизированный язык. Ссылки на переменные не имеют типов, это просто метки, указывающие на объекты данных. И поскольку в вашем случае метод имени A возвращает объект типа B, этот объект, очевидно, имеет доступ ко всем членам класса B. Он не знает, что изначально был создан A, это просто обычный экземпляр B.