2012-04-23 133 views
1

当我在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。有没有任何指导方针?

+1

那些'__init'不应该是'__init__'吗? – ricochet1k 2012-04-23 19:35:38

+1

我真正喜欢的经验法则是:使用最小范围,你可以逃脱。局部变量的范围比属性小得多,因此如果你没有一个令人信服的用例作为属性...... – delnan 2012-04-23 19:38:46

+0

@delnan:不错的建议 – 2012-04-23 20:12:22

回答

5

您在哪里使用self.a您正在创建一个属性,因此可以从课程外部访问此属性并保持该功能。这些应该用于存储关于对象的数据。

你在哪里使用a它是一个局部变量,只能在该函数的作用域内持续,所以应该在你只在函数内使用它的地方使用(在这种情况下)。

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

+0

__init__Typo ...我的问题依然存在。我很难决定自己何时创建/不创建财产。我有时认为同样的事情可以在班级之外使用,并倾向于使用它。在确定是否将它用作self.a或a时,我没有某种决定性的作用。这是我的问题。 – 2012-04-23 20:15:05

+0

@Jack_of_All_Trades正如我在我的问题中所说的那样,这仅仅是内部唯一相关的情况吗?如果是这样,请使用局部变量,否则使其成为属性。尽量使用尽可能小的范围来保持代码清洁,并且记住,你总是可以回去改变它,这不是什么大不了的事情。 – 2012-04-23 22:19:30

1

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

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

1

自身参数是指对象本身。因此,如果您需要在类外部使用类属性,则可以将其称为类实例的名称和属性名称。我不认为有什么时候使用自己的指南,这一切都取决于你的需要。当你建立一个班级时,你应该尝试考虑你将使用你创建的变量。如果你确实知道你将在程序中需要该特定属性,那么你需要添加self。

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如果没有其他价值是适合他们。