Предпосылки : я использую это руководство; Пони Орм. Он говорит мне создать объект (db = Database ()), а затем создать класс, унаследованный от db (class Person (db.Entity) ....). Насколько я могу судить, Person наследуется от экземпляра - я даже не знал, что это возможно. Если это возможно, я не знаю, как поместить класс Person в другой файл, поскольку для всех сущностей потребуется один и тот же объект db, но я не создаю экземпляр объекта db до времени выполнения (но я создаю их при проектировании время). Я чувствую, что мне здесь не хватает чего-то фундаментального.

db = Database()
class Person(db.Entity):
    name = Required(str)
    age = Required(int)
    cars = Set('Car')

Вопросы : (1-й). В приведенном примере действительно ли Person наследует экземпляр (db) или происходит что-то еще? (2-й) Как мне поместить Person (и другие классы) в отдельный файл и поделиться экземпляром db?

Примечание: я использую Python 3.4.

[РЕДАКТИРОВАТЬ]

print(type(db.Entity)) # yields: <class 'pony.orm.core.EntityMeta'>
1
SteveJ 21 Июн 2017 в 01:51
Хотя db является экземпляром, db.Entity может быть либо свойством экземпляра, либо свойством класса. Похоже, что db.Entity является свойством экземпляра, который является динамическим классом, который ссылается на другие свойства экземпляра. Трудно разобрать это, не углубляясь в исходный код, но print(type(db.Entity)) может кое-что раскрыть.
 – 
Jared Goguen
21 Июн 2017 в 02:07
1
Совместное использование экземпляра db может быть таким же простым, как создание его экземпляра в одном файле и его импорт в другие.
 – 
Jared Goguen
21 Июн 2017 в 02:08
Спасибо за ответ ... так будет ли этот файл чем-то вроде (db_creator), который импортируются всеми моими сущностями, и вспомогательным классом, который использует эти сущности?
 – 
SteveJ
21 Июн 2017 в 02:14
Ага, что-то в этом роде. Возможно, вам придется позаботиться о том, чтобы при каждом импорте не создавался новый объект db (я не думаю, что так будет), но это легко проверить.
 – 
Jared Goguen
21 Июн 2017 в 02:18

1 ответ

Лучший ответ
  1. Конечно, наследование от экземпляра невозможно. db может быть экземпляром Database, но db.Entity (от которого вы наследуете) в значительной степени является классом. Если вы посмотрите на исходный код вы можете видеть, что это динамически созданный класс:

    self.Entity = type.__new__(EntityMeta, 'Entity', (Entity,), {})

  2. Если вы не создаете экземпляр переменной db до времени выполнения, это сложно. Вы должны выбрать: либо создать экземпляр db при запуске программы и определить свой класс Person как обычно, либо отложить определение класса до тех пор, пока не будет создан экземпляр db. Вообще говоря, никогда не стоит создавать классы во время выполнения, поэтому я бы рекомендовал сразу же создать экземпляр db.

    Однако разделить это на несколько файлов несложно. В файле A.py вы создаете экземпляр db:

    db = Database()

    А в B.py вы просто импортируете A:

    из базы данных импорта класс Person (db.Entity):

4
Aran-Fey 21 Июн 2017 в 02:13
Технически можно наследовать от экземпляра, который не является классом (все классы являются экземплярами метакласса, после все!), но это не особо полезно.
 – 
juanpa.arrivillaga
21 Июн 2017 в 02:18
Вау, я чувствую, что никогда не стану осваивать Python - спасибо за быстрый ответ. Я воспользуюсь вашим предложением по импорту.
 – 
SteveJ
21 Июн 2017 в 02:19