from sqlalchemy import create_engine
    
    from sqlalchemy import Sequence
    Base = declarative_base()
    Column(Integer, Sequence('user_id_seq'), primary_key=True)
    engine = create_engine('sqlite:///:memory:', echo=True)
    class User(Base):
        __tablename__ = 'users'
        id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
        name = Column(String(50))
        fullname = Column(String(50))
        nickname = Column(String(50))
    
        def __repr__(self):
            return "<User(name='%s', fullname='%s', nickname='%s')>" % (
                                    self.name, self.fullname, self.nickname)
    
    class User1(Base):
        __tablename__ = 'users1'
        id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
        name = Column(String(50))
        fullname = Column(String(50))
        nickname = Column(String(50))
        
        def __init__(self, name, fullname, nickname):
            self.name = name
            self.fullname = fullname
            self.nickname = nickname
    
        def __repr__(self):
            return "<User(name='%s', fullname='%s', nickname='%s')>" % (
                                    self.name, self.fullname, self.nickname)
    
 ed_user = User(name='ed', fullname='Ed Jones', nickname='edsnickname')
 ed_user = User1(name='edd', fullname='Edd Jones', nickname='edsnick')
我从 sqlalchemy 文档网站上拿起这段代码,我认为一切都很好,但是我在理解最后一行时遇到了问题,类用户继承自基类,购买用户类在其他方面没有 init 方法接受任何论点。可以请一些人向我解释这一点..谢谢。这两个类实现了相同的结果,它们创建了一个表,但是在第二个实例中,User1声明了一个init方法,因此显然表的创建发生在基类中,但在第二个实例中,类和实例变量被声明我想知道如果基类没有从子类接收任何数据,它如何能够创建表。
Python 是一种非常动态的语言。有几种方法可以实现这一点。正如@vrevolverr 所说,一个是从它的超类继承。但不幸的是,这里不是这种情况。你可以通过运行来确认print(Base.__init__ is User.__init__),这会给你一个False. 这意味着User.__init__不是从Base.
另一个证据是print('__init__' in User.__dict__)给出了你True,这意味着User该类有自己的__init__方法。而这个方法只能由它的元类给出。所以答案出来了。顺便说一下,在你的情况下,这个元类DeclarativeMeta在sqlalchemy.ext.declarative.
仅供参考。简单地说,元类可以在类的创建过程中做一些事情。例如,向此类添加一个方法。这就是你的__init__来源。
更新:
我原来的回答也解决了你的第二个问题。但我还是想补充一些意见。
一、是否User1.__init__生效?答案是不。试试这个简单的测试:
def init(self, name, fullname, nickname):
    self.name = name
    self.fullname = fullname
    self.nickname = nickname
class User(Base):
    ...
    __init__ = init
print(User.__init__ is init) # False
可以看到__init__你定义的方法已经被替换了。
那么,如何施展这个“魔法”呢?见下文:
def init1(self):
    pass
def init2(self):
    pass
class MyMeta(type):
    # You can also do this in __new__
    def __init__(cls, *args, **kwargs):
        cls.__init__ = init2
        type.__init__(cls, *args, **kwargs)
class MyClass(metaclass=MyMeta):
    __init__ = init1
print(MyClass.__init__ is init1) # False
print(MyClass.__init__ is init2) # True