Привет У меня есть класс в моем Python 3.5.2 код:питон вызов метода на uninstantiated класса
class Foo(object):
__description__ = "Description of Foo"
def get_description(self):
return self.__description__
Теперь я могу назвать get_description на в экземпляре Foo:
foo = Foo()
foo.get_description()
Out: "Description of Foo"
Если я не «т есть экземпляр доступного я мог бы сделать:
print(Foo.__description__)
Out: "Description of Foo"
Но в моем коде я действительно не хочу, чтобы иметь прямой доступ к __description__, так i абстрагировал мой код по линии, чтобы использовать get_description на других классах (Bar, Baz и т. д.), которые не имеют __description__, но генерируют описание по-другому, используя метод get_descripton().
Так мудро, выполнимо или нежелателен сделать:
Foo.get_description(Foo)
Out: "Description of Foo"
Это, кажется, работает, но выглядит довольно уродливые ко мне, есть лучший способ сделать это без instatiate Foo. На самом деле мои объекты Foo представляют собой тысячу строк кода с десятками методов, и кажется, что им не нужно создавать их, когда мне действительно нужно только статически заданное значение __description__
Возможно, мне, вероятно, не хватает некоторых вещей, объясните мне, почему мой образ мышления, вероятно, немного испорчен здесь?
Спасибо довольно прямо, я забыл о classmethods, я возился с staticmethods, которые не могут получить доступ к атрибутам self или cls. Просто! – RvL
Двойные подчеркивания - это потому, что на самом деле Foo - это класс, который наследуется от моделей ORM SQLAlchemy. Где все строки без подчеркивания интерпретируются как столбцы или другие атрибуты, относящиеся к модели (отношения, внешние ключи и т. Д.). Вот почему сама SQLAlchemy ORM также использует, например, \ __ tablename__, чтобы указать таблицу базы данных. Если вы будете использовать «tablename», это будет интерпретироваться как атрибут столбца модели. Django помещает этот материал в класс «Meta» модели, где вы можете использовать «обычные» имена attr. SQLAlchemy не предоставляет этого. – RvL