2015-03-01 4 views
6

Что такое атрибут метода и атрибут данных? Какая разница между ними и тем, что у них общего?Различия между атрибутами данных и атрибутами метода

Я читал python 2.7.9 (https://docs.python.org/2/tutorial/classes.html#random-remarks), и внезапно оба стали трудно понять. Я позабочусь об этом.

ответ

9

Атрибут - это переменная, которая просматривается на другом объекте с использованием точечного синтаксиса: obj.attribute. Путь Python разработан, поиск атрибутов может делать множество вещей, и это разнообразие иногда может приводить к ошибкам, если вы действительно не понимаете, что происходит (это то, о чем предупреждает документация, на которую вы ссылаетесь).

Основная проблема заключается в том, что поиск атрибута может найти либо значение, хранящееся в словаре экземпляра объекта, либо он может найти что-то из класса объекта (или базового класса, если происходит наследование). Методы - это функции, хранящиеся в классе, но вы обычно используете их, просматривая их на экземпляре (который «связывает» метод, вставляя объект в качестве первого аргумента при вызове метода).

Точная последовательность того, что проверяется, когда немного сложна (я описал полный процесс в an answer to another question), но на самом базовом уровне атрибуты экземпляра обычно имеют приоритет над атрибутом класса.

Если атрибут экземпляра и атрибут класса с тем же именем существуют, обычно доступен только атрибут экземпляра. Это может быть очень запутанным, если оно непреднамеренно.

Рассмотрим следующий код:

class Foo(object): 
    def __init__(self, lst): 
     self.lst = lst 

    def sum(self): 
     self.sum = sum(self.lst) 
     return self.sum 

f = Foo([1,2,3]) 

print(f.sum()) 
print(f.sum()) 

В нижней части этого кода, мы делаем два одинаковых вызовов. Первый работает просто отлично, но второй вызывает исключение.

Это потому, что при первом поиске f.sum мы находим метод в классе Foo. Мы можем назвать метод без проблем. Проблема связана с тем, что метод sum присваивает результат его вычисления (сумма элементов в self.lst) атрибуту экземпляра, также называемому sum. Это скрывает метод sum.

Когда второй f.sum() вызов ищет f.sum, он находит атрибут экземпляра, содержащий целое число 6, а не ожидаемый метод. Целое число не является вызываемым, поэтому мы получаем исключение.

Решение, конечно же, не должно использовать одно и то же имя для метода и атрибута. Вышеприведенный код - довольно простой пример. Ошибки, вызванные такими вещами в более сложном коде, могут быть намного сложнее выяснить.

Если вы пишете код, который добавляет атрибуты к объектам, о которых вы мало что знаете, вы должны быть осторожны, чтобы избежать общих имен. Если вы пишете класс mixin, подумайте о двух ведущих символах подчеркивания в именах атрибутов, чтобы вызвать манипулирование именем Python, которое предназначено именно для такого рода ситуаций.

+0

Ваши объяснения довольно просты. Итак, мне кажется, что связанная с документацией информация означает «атрибут данных» = «атрибут экземпляра», «атрибут метода» = «атрибут класса». Если я ошибаюсь, исправьте меня. –

+0

Да, это так. Я думаю, что документация может быть довольно старой и не совсем обновленной. Конечно, «атрибут экземпляра» и «атрибут класса» в наши дни являются гораздо более распространенными. Стоит также отметить, что реальная ситуация немного сложнее, чем я представил здесь. Некоторые типы атрибутов класса (например, объекты «property») будут иметь приоритет над атрибутами экземпляра. Однако вряд ли вы попадете в эту ситуацию по ошибке. – Blckknght

3

атрибут является любая вещь, из-за отсутствия лучшего слова, привязанной к объекту, например:

class Dog: 
    def __init__(self): 
     self.name = "Rufus" 

    def bark(self): 
     print "Woof Woof!" 

В этом случае атрибут данных имя, которое просто значение, которое связанный с экземпляром Собаки. Что касается атрибута метода, один ответ будет методом коры, так как это не столько ценность, сколько действие. Это так же, как на английском. Атрибут данных точно так же, как кажется; это данные, это просто свойство. Метод - это процедура, действие, и именно это атрибут метода.

1

Атрибут в основном ничего, что вы можете сделать instance.attribute_name с. Например, в:

class Hello(object): 
    def __init__(self, word): 
     self.word = word 

    def greet(self): 
     print "Hello: "+self.word 

__init__, greet и word все было бы атрибуты. Я бы предположил, что метод - это все, что объявлено с def в области класса (в отличие от выполнения self.func = lambda x: x * x, например). В этом случае вы попадаете в связанные или несвязанные методы и тому подобное. Важной частью является то, что для атрибута члена, когда вы делаете instance.method_name, вы возвращаете метод привязки, который, когда вы вызываете его, вызывается исходным методом с экземпляром в качестве первого аргумента.

Кроме того, после прочтения некоторых разделов их формулировка несколько запутанна/ошибочна. Например, они говорят: «Атрибуты атрибутов атрибутов переопределяют атрибуты метода с тем же именем», которые, насколько мне известно, лучше поместить как атрибут экземпляра, переопределить атрибуты класса с тем же именем. Из примера я дал, если мы расширили это:

class Hello(object): 
    greeting = "Hello: " 
    def __init__(self, word): 
     self.word = word 

    def greet(self): 
     print self.greeting+self.word 

Тогда мы могли бы сделать:

>>> a = Hello("world") 
>>> a.greeting = "Goodbye " 
>>> a.greet() 
"Goodbye world" 

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

0

Вот прямое объяснение вашего вопроса, которое помогло мне понять разницу между атрибутом и методом.

Класс подобен набору инструкций или чертежей для создания многих объектов, которые имеют общие характеристики.

Объект - это тип данных, построенный в соответствии со спецификациями, предоставляемыми определением класса.

Атрибут - это значение (характеристика). Подумайте об атрибуте как переменной, которая хранится внутри объекта.

Метод представляет собой набор инструкций. Методы - это функции, связанные с объектом. Любая функция, включенная в определение родительского класса, может быть вызвана объектом этого класса.

Надеюсь, это поможет.

Смежные вопросы