2016-06-19 1 views
0

В викторике python атрибуты были описаны как переменные, определенные в методах, и по этой ссылке: http://pythoncentral.io/introduction-to-python-classes/ они описывают значение val из приведенного ниже кода в качестве переменной-члена.Является ли переменная-членом той же вещью, что и атрибут экземпляра в python?

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

Я просто интересно, если это означает, что вал является атрибутом экземпляра (или, возможно, атрибут класса, так как он был определен в инициализации разделе? Извините, если это повторный вопрос, но я не мог» t найти что-либо подтверждающее это.

+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 

!

Заметьте, что это доступно непосредственно в качестве переменной класса, а не с помощью метода.

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!!!

Теперь, поскольку переменные экземпляра объявлены как частное использование __, вы обычно не изменять их непосредственно, но вместо этого используйте свойства, чтобы предоставить методы, которые позволяют вам изменять их. Эти правильные методы позволяют добавлять методы установки и получения (например, проверки или проверки типов). Пример:

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 

File "C:/MyClass.py", line 38, in
object_instance_one.instance_variable_two = 2 File "C:/MyClass.py", line 28, in > >instance_variable_two raise TypeError("instance variable two must be of type str") TypeError: instance variable two must be of type str