Я знаю, что на эту тему есть много тем, и я посмотрел на многих. Однако это все еще запутывает для меня, когда целесообразно использовать статические методы и методы класса вместо метода экземпляра.Когда использовать статические методы и методы класса
В моем примере я создаю скрипт для программы 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
Наконец, я знаю много людей говорят в таких случаях, они не должны быть в классе вообще, или что-то в этом роде, но это так, как я этого хочу, я просто хочу узнать больше, когда использовать эти типы методов.
Это очень полезно! Однако является ли метод класса vs экземпляром, определяемым доступностью? Например, у меня есть класс птицы с цветовым методом, но этот метод используется только в классе другим методом экземпляра. Будет ли смысл иметь классный метод? –
Нет, это не то, как мы должны это выразить. Реальный вопрос: является ли метод индивидуальным, или он коллективный. Пример. Человеческий экземпляр имеет метод для секса(). sex() не является коллективным действием (по крайней мере, надеюсь), а метод пола человека является частным, так как другие человеческие экземпляры не должны ссылаться на метод sex() текущего человека. Итак, sex() является частным и экземпляром. Поэтому вопрос заключается не в уровне гласности, а в индивидуальном или коллективном характере метода/члена. –