python中的类,如何设置属性

时间:2012-04-23 19:33:01

标签: python

当我在python中编写类时,大部分时间,我都渴望将我使用的变量设置为对象的属性。关于哪些变量应该用作类/实例属性以及哪些不应该使用?

是否有任何规则或一般指导原则

例如:

class simple(object):
    def __init(self):
        a=2
        b=3
        return a*b

class simple(object):
    def __init(self):
        self.a=2
        self.b=3
        return a*b

虽然我完全理解属性应该是对象的属性。当类声明很简单时,这很容易理解,但随着程序越来越长,并且有很多地方应该在各个模块之间进行数据交换,我对应该使用a / b或self.a的地方感到困惑。 /self.b。对此有什么指导吗?

4 个答案:

答案 0 :(得分:5)

在使用self.a的情况下,您正在创建一个属性,因此可以从类外部访问该属性,并持续超出该函数。这些应该用于存储有关对象的数据。

在使用a的地方,它是一个局部变量,只在该函数的范围内持续存在,因此应该在函数中使用它的地方使用(如本例所示)。

请注意,__init具有误导性,因为它看起来像__init__ - 但不是构造函数。如果你打算将它们作为构造函数,那么返回一个值是没有意义的(因为新对象是返回的对象)。

答案 1 :(得分:1)

我试着想象在实现它之前我希望我的类的API看起来像什么。我想,如果我没有写这个类,我想阅读有关这个​​特定变量的文档吗?如果阅读该文档只会浪费我的时间,那么它应该是一个局部变量。

有时,您需要保留一些信息,但是您不一定希望它成为API的一部分,即使用附加下划线的约定时。例如self._some_data_that_is_not_part_of_the_api

答案 2 :(得分:1)

self参数指的是对象本身。因此,如果您需要使用类外部的类属性,您可以将其称为类实例的名称和属性名称。我认为什么时候使用自己没有任何指导,这一切都取决于你的需要。在构建类时,您应该尝试考虑将使用您创建的变量的内容。如果您确定在要导入课程的程序中需要该特定属性,请添加self。

答案 3 :(得分:1)

class Person(object):
    def __init__(self, name):
        # Introduce all instance variables on __init__
        self.name = name
        self.another = None

    def get_name(self):
        # get_name has access to the `instance` variable 'name'
        return self.name

因此,如果您希望变量在多个方法上可用,请生成 它是一个instance变量。

请注意我在__init__上介绍所有实例变量的评论。 虽然下面的示例是有效的python,但不要这样做。

class Person(object):
    def __init__(self):
        self.a = 0
    def foo(self):
        self.b = 1 # Whoa, introduced new instance variable

而是初始化__init__上的所有实例变量并进行设置 如果没有其他值适合他们,他们到None