当我在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。对此有什么指导吗?
答案 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
。