Различия между атрибутами данных и атрибутами метода

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

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

Ответ 1

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

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

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

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

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

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, которое предназначено именно для такого рода ситуаций.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

Атрибут - это все, что вы можете сделать 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, например). В этом случае вы попадаете в связанные или несвязанные методы и тому подобное. Важной частью является то, что для атрибута member, когда вы делаете 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"

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

Ответ 5

Атрибут описывает объект, в то время как метод воздействует на объект и изменяет его.