2016-06-17 3 views
1

Сегодня я экспериментировал и/или возился с Python 3.5.Класс в классе, должен ли он быть установлен или намерен?

я случайно «случайно» написать это:

class Apple(object): 
    class green(object): 
     def eat(): 
      print("You just ate a green apple...") 

    class red(object): 
     def eat(): 
      print("You just ate a red apple...") 

Значение я теперь могу сделать:

Apple.red.eat() # would print: "You just are a red apple..." 
Apple.green.eat() # would print: "You just are a green apple..." 

Который привел меня спросить это, как функции, такие как os.path.exists() созданы или они создаются с использованием другого метода "?
Должно ли это быть исправлено или преднамеренно?

Благодарим вас заблаговременно.

+0

Я не уверен, но я думаю, что 'import os' получает весь контент от' os.py' ... так ' path' должен быть 'class' внутри файла' os.py', а 'exists()' должен быть 'function' внутри класса' path'. –

+1

'os.path' является ** подмодулем **,' os' является ** пакетом **. –

+0

Если 'os.path' был классом, тогда вы могли бы создавать экземпляры' os.path', что не имеет никакого смысла, такая же проблема с вашим кодом. Выполнение 'x = Apple.red(); x.eat() 'вызывает ошибку, потому что' eat' не является допустимым методом (отсутствует аргумент 'self') –

ответ

4

Классы в пределах классов прекрасно работают в Python - Тем не менее, основной механизм питона для обработки пространств имен модули и пакеты, а не классы. Я не нашел много пользы для классов внутри классов (хотя, вероятно, есть около действительных прецедентов).

Чтобы создать что-то вроде os.path.exists, я бы направить вас к source за исключением того, что os.path делает некоторые довольно отрывочные вещи, чтобы создать пространство имен (модифицирующие sys.modules) и избегает использования пакетов. Вы лучше создать пакет, если вам не нужно условно импортировать различные вещи под таким же названием ...

В этом случае, чтобы установить пакет, вы можете использовать структуру каталогов что-то вроде :

apples 
    +-- __init__.py (empty) 
    | 
    +-- base.py (holds BaseApple class) 
    | 
    +-- green.py (holds GreenApple which inherits from BaseApple) 
    | 
    +-- red.py (holds RedApple which inherits from BaseApple) 

Тогда, предполагая, что ваш PYTHONPATH может правильно найти все, вы могли бы сделать:

from apples.green import GreenApple 
from apples.red import RedApple 

Очевидно, что это только одна о f многие способы его настройки. Без реального примера того, что вы делаете, трудно дать какой-либо конкретный совет.

+0

Спасибо за ваше время и помощь, я ценю это, +1. –

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