2016-12-22 1 views
0

Привет У меня есть класс в моем 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__

Возможно, мне, вероятно, не хватает некоторых вещей, объясните мне, почему мой образ мышления, вероятно, немного испорчен здесь?

ответ

3

Вам нужен класс.

class Foo(object): 
    __description__ = "Description of Foo" 

    @classmethod 
    def get_description(cls): 
     return cls.__description__ 

Теперь вы можете вызвать метод непосредственно на классе: Foo.get_description().

(Обратите внимание, что не рекомендуется создавать свои собственные двойные Подчеркивание атрибуты, так как они зарезервированы для внутреннего использования в Python, просто использовать стандартное имя, например description.)

+0

Спасибо довольно прямо, я забыл о classmethods, я возился с staticmethods, которые не могут получить доступ к атрибутам self или cls. Просто! – RvL

+0

Двойные подчеркивания - это потому, что на самом деле Foo - это класс, который наследуется от моделей ORM SQLAlchemy. Где все строки без подчеркивания интерпретируются как столбцы или другие атрибуты, относящиеся к модели (отношения, внешние ключи и т. Д.). Вот почему сама SQLAlchemy ORM также использует, например, \ __ tablename__, чтобы указать таблицу базы данных. Если вы будете использовать «tablename», это будет интерпретироваться как атрибут столбца модели. Django помещает этот материал в класс «Meta» модели, где вы можете использовать «обычные» имена attr. SQLAlchemy не предоставляет этого. – RvL

1

двумя способами:

Первые является @classmethod:

class Foo(object): 

    @classmethod 
    def get_description(cls): 
     return "Description of Foo" 

print(Foo.get_description()) 

Во-вторых (я думаю, что лучший способ) является __doc__:

class Foo(object): 
    """Description of Foo""" 


print(Foo.__doc__) 
+2

Или объедините оба '@classmethod def get_description (cls): return cls .__ doc__' – AChampion

Смежные вопросы