成员变量与python中的实例属性相同吗?

时间:2016-06-19 10:53:48

标签: python attributes

在python wiki中,属性被描述为方法中定义的变量,在这个链接中:http://pythoncentral.io/introduction-to-python-classes/他们将下面代码中的val描述为成员变量。

    class Foo:
        def __init__(self, val):
           self.val = val
        def printVal(self):
           print(self.val)

我只是想知道这是否也意味着val是一个实例属性(或者可能是一个类属性,因为它是在 init 部分中定义的?对不起,如果这是一个重复的问题,但我无法和找不到任何确认的内容。

1 个答案:

答案 0 :(得分:1)

实例/成员变量是与类的特定实例关联的值。对于每个类,这些可以是不同的,并且可以通过类方法访问。类变量在类的每个实例中最初都是相同的。例如,采用以下类文件:

class MyClass(object):
    class_variable = "!"

    def __init__(self, first_word, second_word):
        self.__instance_variable_one = first_word
        self.__instance_variable_two = second_word

    def to_string(self):
        return self.__instance_variable_one + " " + self.__instance_variable_two

请注意,这里的实例变量以__为前缀,表示这些变量应该是私有的。现在使用这个类:

object_instance_one = MyClass("Hello", "World")
object_instance_one.to_string()
  

Hello World

print object_instance_one.class_variable
  

<!/ P>

请注意,这可以直接作为类变量访问,而不是通过方法。

print object_instance_one.to_string() + object_instance_one.class_variable
  

Hello World!

如果您愿意,可以覆盖类变量:

object_instance_one.class_variable = "!!!"
print object_instance_one.to_string() + object_instance_one.class_variable
  

Hello World !!!

现在因为实例变量使用__声明为private,所以通常不会直接修改它们,而是使用属性来提供允许您修改这些变量的方法。这些正确的方法允许您添加setter和getter方法(例如验证或类型检查)。一个例子:

class MyClass(object):
class_variable = "!"

def __init__(self, first_word=None, second_word=None):
    self.__instance_variable_one = first_word
    self.__instance_variable_two = second_word

@property
def instance_variable_one(self):
    return self.__instance_variable_one

@instance_variable_one.setter
def instance_variable_one(self, value):
    if isinstance(value, str):
        self.__instance_variable_one = value
    else:
        raise TypeError("instance variable one must be of type str")

@property
def instance_variable_two(self):
    return self.__instance_variable_two

@instance_variable_two.setter
def instance_variable_two(self, value):
    if isinstance(value, str):
        self.__instance_variable_two = value
    else:
        raise TypeError("instance variable two must be of type str")

def to_string(self):
    return str(self.__instance_variable_one) + " " + str(self.__instance_variable_two)

用法:

object_instance_one = MyClass()
object_instance_one.instance_variable_one = "Hello"
object_instance_one.instance_variable_two = "World"
print object_instance_one.to_string() + object_instance_one.class_variable
  

Hello World!

object_instance_one.instance_variable_two = 2
  

文件&#34; C:/MyClass.py",第38行,在中   object_instance_one.instance_variable_two = 2文件&#34; C:/MyClass.py",   第28行,&gt; &gt; instance_variable_two引发TypeError(&#34;实例变量   两个必须是str&#34;类型错误:实例变量2必须是   输入str