Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 何时使用静态方法和类方法_Python_Python 2.7_Methods_Maya - Fatal编程技术网

Python 何时使用静态方法和类方法

Python 何时使用静态方法和类方法,python,python-2.7,methods,maya,Python,Python 2.7,Methods,Maya,我知道关于这个话题有很多话题,我也看过很多。然而,当使用静态方法和类方法代替实例方法时,我仍然感到困惑 在我的示例中,我正在为autodesk程序maya制作脚本。我的一个模块中有一个类,其中包含将在其中生成对象的方法,如下所示: class Curves(object): """Contains methods to generate curves """ @classmethod def circle_crv(cls): name = mc.c

我知道关于这个话题有很多话题,我也看过很多。然而,当使用静态方法和类方法代替实例方法时,我仍然感到困惑

在我的示例中,我正在为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]
但是,外部模块永远不会直接访问这些模块。我通过外部模块访问的字典(首先通过外部用户字典进行搜索)运行所有这些方法,如下所示:

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
所以,第一个问题是,如果从未从类或模块外部访问过该方法,那么它是否需要是实例?在这种情况下,静态方法或类方法是否合适,因为在这种情况下,我不需要单独的实例,它只做一件事,从不改变大小或形状,以后再调整大小

接下来,如果我在一个类中有一个只执行下面这样一个简单计算的方法,静态方法是否合适?既然它每次只需要输入和输出一个东西,那么它有什么理由成为一个实例吗

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

最后,我知道很多人说,在这些情况下,这些根本不应该在类中,或者类似的东西,但这是我想要的方式,我只是想更深入地了解何时使用这些类型的方法。

简单地说,实例是实体,类是实体的概念。例如,如果你有一个类Human,那么一个实例就是一个人,而Human类对应于人性的概念。例如,衡量一个人产生的污染程度是毫无意义的。衡量人类造成的污染更有意义。所以,如果你有一个叫做measureGeneratedPollution的方法,它应该是静态的。但是,如果您有一个名为呼吸的方法,那么这是一个单独的操作是很自然的,所以呼吸应该是一个实例级方法。实例级别与静态级别本质上类似于个人操作与集体操作

让我们看另一个成员示例。让我们考虑一下类群。这些鸟总体上没有颜色,因此颜色应该是实例级别的成员。然而,birdCount是一个集合信息,因此它应该是静态的

请记住,对于成员/方法,级别(实例或类级别)不是由可访问性决定的,而是由拥有属性或执行操作的主体决定的。所以,如果我们将其转化为句子逻辑,那么你应该在制定此类计划时给自己写下句子,直到你变得更加专业。例如:

这只鸟有颜色

有许多鸟

向自己提问:

谁有颜色?->鸟->单数->实例谁拥有

数字?->鸟类->复数->集体->静态


这很有帮助!然而,类方法和实例是由可访问性决定的吗?比如说,我有一个带有color方法的bird类,但是这个方法只在类中由另一个实例方法使用。作为一个类方法,这更有意义吗?不,这不是我们应该说的。真正的问题是:这种方法是个人的,还是集体的。示例:人类实例具有sex()的方法。sex()不是一个集体动作(至少,希望如此),并且此人的sex方法是私有的,因为其他人类实例不应该能够调用当前个人的sex()方法。因此,sex()是私有的和实例级别的。因此,问题不在于宣传水平,而在于方法/成员的个人或集体性质。