#python #sqlalchemy
#python #sqlalchemy
Вопрос:
Например, возьмите простой пример из документов здесь:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return '<User %r>' % self.username
Я все еще новичок в классах Python, поэтому прошу прощения, если это основной вопрос.
Комментарии:
1. Поскольку вы определяете атрибуты класса , обратите внимание, когда вы используете их в методе экземпляра, который вы действительно используете
self.
.2. @jonrsharpe хорошо, я вижу, так что это определяет «id», «username» и «email» во всех экземплярах пользовательского класса одинаково. Я предполагаю, что мой следующий вопрос заключается в том, что происходит за кулисами при вызове
User(username='susan', email='susan@example.com')
? Я предполагаю, что имя пользователя не перезаписывается простой строкой?3. @Nold — sqlalchemy выполняет множество метапрограммирования за кулисами. То, что происходит, не похоже на стандартный класс python. Как все это делается — это большой вопрос, который может быть больше в рамках вашей поисковой системы, чем stackoverflow.
4. @tdelaney Я вижу, спасибо за понимание.
Ответ №1:
Это метапрограммирование Flask-SQLAlchemy. Назначения уровня класса определяют схему. Когда создаются экземпляры класса, они включают какой-либо метод доступа, так что ссылка на то же имя в self
результатах приводит к определенному значению из столбца. Это работает, потому что sqlalchemy написала много кода, чтобы это произошло.
Это не так, как работают обычные классы Python. Вам не нужно определять атрибуты на уровне класса для обычного класса python. Для обычного класса access to self.bar
проверяет, является ли «bar» локальным для экземпляра, а затем проверяет, есть ли «bar» в классе. Это похоже на запасной вариант, и он не обязателен. В любом случае параметр self.bar
создает допустимое значение в экземпляре. Как в:
>>> class Foo:
... bar = 1
... def get_bar(self):
... return self.bar
... def set_bar(self, val):
... self.bar = val
...
>>> foo = Foo()
>>> print(Foo.bar, foo.bar, foo.get_bar())
1 1 1
>>> foo.set_bar(999)
>>> print(Foo.bar, foo.bar, foo.get_bar())
1 999 999
При изучении python магия, стоящая за такими модулями, как sqlalchemy, numpy и pandas, может оставить неверное представление о том, как работает язык.