2015-02-12 2 views
2

Имея класс находится где-то в my_module.pyМожно ли импортировать метод класса без экземпляра класса?

я могу получить доступ к его методу как этого

from .my_module import Mailer 

mailer = Mailer() 
mailer.do_stuff() 

Но если я могу импортировать только do_stuff методы из класса? Если да, могу ли я импортировать не только статические методы?

+2

Если у вас есть статический метод, который вы хотите использовать отдельно от класса, * сделайте его функцией *. Что вы подразумеваете под «инициализацией» *? Вы можете обращаться к классу и статическим методам без создания экземпляра ('Mailer.do_stuff()'), но не без инициализации объекта класса (потому что до тех пор, пока это не произойдет * они не существуют *). – jonrsharpe

+0

Да, у вас это есть, я имел в виду создание класса – micgeronimo

ответ

4

Вы можете получить класс и статические методы, не создавая экземпляр. Например, возьмем следующий демонстрационный класс:

class Demo(object): 

    def instance_method(self): 
     print "Called an instance method" 

    @classmethod 
    def class_method(cls): 
     print "Called a class method" 

    @staticmethod 
    def static_method(): 
     print "Called a static method" 

Теперь мы можем назвать два из этих методов непосредственно на классе:

>>> Demo.class_method() 
Called a class method 
>>> Demo.static_method() 
Called a static method 

Но мы не можем вызвать метод экземпляра, как мы не экземпляр для self аргумента:

>>> Demo.instance_method() 

Traceback (most recent call last): 
    File "<pyshell#4>", line 1, in <module> 
    Demo.instance_method() 
TypeError: unbound method instance_method() must be called with Demo instance as first argument (got nothing instead) 

Вы можете назвать все три типа метода на примере:

>>> instance = Demo() 
>>> instance.class_method() 
Called a class method 
>>> instance.static_method() 
Called a static method 
>>> instance.instance_method() 
Called an instance method 

Обратите внимание, что статические методы не используют какой-либо класс или экземпляр атрибутов, поэтому они в значительной степени идентичны функциям. Если вы обнаружите, что хотите вызвать функцию без ссылки на класс или экземпляр, просто укажите его на функцию.