#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.