【问题标题】:python - best practise for using variables in class and functionspython - 在类和函数中使用变量的最佳实践
【发布时间】:2012-08-31 14:26:00
【问题描述】:

我正在编写大量代码,但我对在 python 类及其函数中使用变量的最佳方式没有足够的经验,所以我想我会征求一些意见。这是我如何做到这一点的示例

class MyClass():
    vara = 'Class Variable A'

    def __init__(self):
        self.varb = 'Class instantiation Variable B'

    def a(self):
        varc = 2
        vard = 3

        print 'def a function variables unchanged', varc, vard

        MyClass.vara = 'Class Variable A now changed by def a'

    def b(self):
        print self.varb
        self.varb = 'Class instantiation Variable B now changed by def b'
        print self.varb

if __name__ == "__main__":
    print MyClass.vara

    a = MyClass()
    a.a()
    a.b()

    print MyClass.vara

    a.a()

这给出了这个结果

Class Variable A
def a function variables unchanged 2 3
Class instantiation Variable B
Class instantiation Variable B now changed by def b
Class Variable A now changed by def a
def a function variables unchanged 2 3

我在 django 中的应用程序正在使用一个具有大约 25 个函数的类。它是一个测试应用程序,每个函数都代表一个 API 调用。每个 API 调用都会根据结果给出一些变量,我需要这些变量由函数设置以供其他函数使用 - 换句话说,我需要由其他函数调用这些局部函数变量。我想知道做到这一点的最佳方法。

在上面的示例中,我可以使用类中的函数设置类变量 vara,通过这样做MyClass.vara = 'something' 或者我可以设置实例化构造函数中的变量__init__。然后我可以使用任何函数调用这些变量。

有什么更好的方法,或者有更好的方法吗?

【问题讨论】:

    标签: python variables global-variables


    【解决方案1】:

    不确定我是否完全明白你的要求,但如果我理解正确,答案是这取决于你想做什么。如果您希望为整个班级存储一次,则应在班级上设置属性(如在vara 中)。如果您想为每个实例设置一个单独的属性,您应该在__init__ 中的实例上设置它(就像在您的varb 中一样)。

    如果你有一个可变对象(如列表)作为属性的值,差异会变得更加明显。见下文:

    >>> class Foo(object):
    ...     classVar = []
    ...     def __init__(self):
    ...         self.instVar = []
    >>> f = Foo()
    >>> g = Foo()
    >>> f.classVar
    []
    >>> f.instVar
    []
    >>> g.classVar
    []
    >>> g.instVar
    []
    >>> f.instVar.append(1)
    >>> f.instVar
    [1]
    >>> g.instVar
    []
    >>> f.classVar.append(1)
    >>> f.classVar
    [1]
    >>> g.classVar
    [1]
    

    请注意,在最后一点,变异 f.classVar 也会影响 g.classVar。因为这是一个类属性,所以它在类的所有实例之间共享。实例属性 (instVar) 对于每个实例都是独立的。

    【讨论】:

    • 啊好吧..我想我明白了。所以我可以使用一个对象创建许多实例。无论任何一个对象是否更改类变量,object.class 变量都将是相同的,但该类的即时变量将独立于每个对象?
    猜你喜欢
    • 1970-01-01
    • 2015-09-04
    • 2014-10-22
    • 2012-05-04
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多