2015-02-15 9 views
3

Я знаю, что на эту тему есть много тем, и я посмотрел на многих. Однако это все еще запутывает для меня, когда целесообразно использовать статические методы и методы класса вместо метода экземпляра.Когда использовать статические методы и методы класса

В моем примере я создаю скрипт для программы autodesk maya. Один из моих модулей имеют класс в нем с методами, которые будут генерировать объект в нем, как показано ниже:

class Curves(object): 
    """Contains methods to generate curves 
    """ 
    @classmethod 
    def circle_crv(cls): 
     name = mc.circle(nr=(0, 1, 0), c=(0, 0, 0), r=0.5) 
     mc.delete(name, ch=True) 
     mc.addAttr(name[0], ln='crvType', dt='string', h=True) 
     mc.setAttr(name[0]+'.crvType', 'circle_crv', typ='string', l=True) 
     return name[0] 

Однако этот никогда не будет доступен непосредственно с помощью внешнего модуля. Я бегу все эти методы через словарем Thats доступ к внешним модулям (которые прежде всего ищут через внешний пользовательский словарь), что ниже:

def curve_lib(self, crvtype): 
     """Creates a specified curve at origin 

     Args: 
     crvtype (str): a key to call a function to generate a curve at the 
      origin 
     """ 
     userlib = self.usercurve_lib() 

     curves_dic = { 
      'bendjoint_crv' : self.bendjoint_crv, 
      'circle_crv' : self.circle_crv, 
      'circlearrow_crv' : self.circlearrow_crv, 
      'connectjoint_crv' : self.connectjoint_crv, 
      'fktext_crv' : self.fktext_crv, 
      'joint_crv' : self.joint_crv, 
      'iktext_crv' : self.iktext_crv, 
      'cube_crv' : self.cube_crv, 
      'quadarrow01_crv' : self.quadarrow01_crv, 
      'quadarrow02_crv' : self.quadarrow02_crv, 
      'quadarrow03_crv' : self.quadarrow03_crv, 
      'quadarrow04_crv' : self.quadarrow04_crv, 
      'rootjoint_crv' : self.rootjoint_crv, 
      'square_crv' : self.square_crv, 
      'switch_crv' : self.switch_crv, 
      'triangle_crv' : self.triangle_crv 
     } 

     if crvtype in userlib: 
      name = self.usercurve_lib(crvtype) 
     elif crvtype in curves_dic: 
      name = curves_dic[crvtype]() 
     else: 
      raise NameError('Key "%s" not found' %(crvtype)) 
     return name 

Так первый вопрос, если метод никогда не доступен из-за пределов класс или модуль, нужно ли быть экземпляром? И будет ли в этом случае метод static или class, так как в этом случае мне не нужны отдельные экземпляры этого, он просто делает одно и никогда не изменяет размер или форму, которые впоследствии будут изменены.

Далее, если у меня есть метод в классе, который просто выполняет простой расчет, как показано ниже, будет ли применяться статический метод? Так как его просто принимать ввод и вывод одной вещи каждый раз, есть ли основания для того, чтобы быть экземпляром ?:

class Vectors(object): 
    """Contains methods for various vector math functions 
    """ 

    @staticmethod 
    def pointLineDist(vec_a, vec_b, vec_c): 
     """The distance between the line ab and the point c. 

     Args: 
     vec_a (float list): First vector to find distance of. 
     vec_b (float list): Second vector to find distance of. 
     vec_c (float list): Third vector to find distance of. 
     """ 
     ab = dt.Vector(vec_b) - dt.Vector(vec_a) 
     ac = dt.Vector(vec_c) - dt.Vector(vec_a) 
     length = dt.length(dt.cross(ab, ac))/dt.length(ab) 

     return length 

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

ответ

2

Проще говоря, экземпляр является сущностью, класс - это понятие сущности. Например, если у вас есть класс Human, то экземпляр - это человек, а человеческий класс соответствует понятию человечества. Например, бессмысленно измерять уровень загрязнения, создаваемого человеком. Измерение загрязнения, вызванного человечеством, имеет больше смысла. Итак, если у вас есть метод под названием measureGeneratedPollution, он должен быть статическим. Однако, если у вас есть метод, называемый дыханием, то естественно, что это индивидуальное действие, поэтому дыхание должно быть методом уровня экземпляра. Уровень на уровне экземпляра и статического уровня по существу аналогичен индивидуальному действию и коллективному действию.

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

Помните, что для участников/методов уровень (экземпляр или уровень класса) не определяется доступностью, а субъектом, имеющим атрибут или выполняющим действие. Итак, если мы переведем это в логику предложения, тогда вы должны записать предложения для себя, пока вы делаете такие планы, пока не получите более профессиональный характер. Предложения, такие как:

Птица имеет цвет.

Существует множество птиц.

Задавайте вопросы себе:

Кто имеет цвет? -> птица -> единственная -> пример Кто имеет

номер?-> птицы -> множественные -> коллективные -> статические

+0

Это очень полезно! Однако является ли метод класса vs экземпляром, определяемым доступностью? Например, у меня есть класс птицы с цветовым методом, но этот метод используется только в классе другим методом экземпляра. Будет ли смысл иметь классный метод? –

+0

Нет, это не то, как мы должны это выразить. Реальный вопрос: является ли метод индивидуальным, или он коллективный. Пример. Человеческий экземпляр имеет метод для секса(). sex() не является коллективным действием (по крайней мере, надеюсь), а метод пола человека является частным, так как другие человеческие экземпляры не должны ссылаться на метод sex() текущего человека. Итак, sex() является частным и экземпляром. Поэтому вопрос заключается не в уровне гласности, а в индивидуальном или коллективном характере метода/члена. –

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