1

当我在 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

4 回答 4

6

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

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

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

于 2012-04-23T19:34:26.583 回答
2
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

于 2012-04-23T23:57:46.793 回答
1

我试着想象在实现它之前我希望我的类的 API 是什么样子。我想,如果我不写这个类,我会想阅读关于这个特定变量做什么的文档吗?如果阅读该文档只会浪费我的时间,那么它可能应该是一个局部变量。

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

于 2012-04-23T21:49:47.503 回答
1

self 参数是指对象本身。因此,如果您需要使用类之外的类属性,您可以将其称为类实例的名称和属性名称。我认为何时使用 self 没有任何指导方针,这完全取决于您的需要。当你构建一个类时,你应该尝试考虑你将使用你创建的变量来做什么。如果您确定在导入类的程序中需要该特定属性,请添加 self.

于 2012-04-23T22:40:18.320 回答