How to place class in its own file when it appears to be inheriting from an instance?

268 Views Asked by At

Background: I'm using this guide; Pony Orm. It tells me to create an object (db = Database()), then create a class that inherits from db (class Person(db.Entity)....). As far as I can tell, Person is inheriting from an instance - I didn't even know that was possible. If it is possible, I don't know how to put the Person class in another file, since all entities would need the same db object, but I don't instantiate the db object until runtime (yet I'm creating them at design time). I feel like I'm missing something fundamental here.

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

Questions: (1st) In the example given, is Person really inheriting from an instance(db) or is something else going on? (2nd) How would I put the Person (and other classes) in its own file and share the db instance?

Note: I'm running Python 3.4.

[EDITs]

print(type(db.Entity)) # yields: <class 'pony.orm.core.EntityMeta'>
1

There are 1 best solutions below

2
Aran-Fey On BEST ANSWER
  1. Of course it's not possible to inherit from an instance. db may be an instance of Database, but db.Entity (which you're inheriting from) is very much a class. If you take a look at the source code you can see that it's a dynamically created class:

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

  2. If you don't instantiate the db variable until runtime, this is tricky. You have to choose: either instantiate db at program startup and define your Person class as usual, or postpone the class definition until the db instance is created. Generally speaking it's never a good idea to create classes during runtime, so I would recommend instantiating db right away.

    Splitting this into multiple files however is easy. In file A.py you instantiate the db:

    db = Database()

    And in B.py you simply import A:

    from A import db class Person(db.Entity):