2015-07-31 2 views
0
class Animal(object): 
    """Makes cute animals.""" 
    is_alive = True 
    health = 'good' 
    def __init__(self, name, age): 
     self.name = name 
     self.age = age 
    # Add your method here! 
    def description(self): 
     print self.name 
     print self.age 

hippo = Animal('Tom', '20') 
sloth = Animal('Randy', '18') 
ocelot = Animal('Birdman','57') 
hippo.description() 
print ocelot.health 
print hippo.health 
print sloth.health 

Код, указанный выше, относится к курсу python codecademy. Я запутался в некоторых определениях, связанных с ООП. Если мое понимание верное, функция, определенная внутри класса, называется методом, поэтому, когда она вызывается, например, так: «hippo.description()», «(») необходимы из-за синтаксиса, связанного с функции.Разница между методами и переменными-членами?

Однако я начинаю путать с «self.name» и «self.age». Это также методы? Мне было интересно, были ли они, возможно, переменными-членами, но тогда они не будут определены так же, как переменная «здоровье» была выше? И если они не являются переменными-членами, откуда они могут быть доступны с использованием точечной нотации так же, как переменные-члены?

Приветствия

+1

Это поможет использовать номенклатуру Python; 'ocelot.health' является атрибутом * класса *, общим для всех' Animal', тогда как 'ocelot.name' является атрибутом * экземпляра *, уникальным для этого конкретного экземпляра. Оба могут быть доступны через 'self' в * методах экземпляра *. – jonrsharpe

+0

См. Http://stackoverflow.com/questions/7548546/python-class-attributes-and-instance-attributes и http://stackoverflow.com/questions/207000/python-difference-between-class-and-instance -attributes Я думаю, что я должен отметить это как дубликат, но мне нужно понять, из какого из них: P –

+0

@FilipMalczak С другой стороны, заголовок запрашивает разницу между атрибутами метода и переменной, а не атрибутами класса и экземпляра. – skyking

ответ

0

Я предполагаю, что вы пришли из более традиционного языка программирования ООП, как C++ или Java.

health в классе Animal - это то, что вы бы назвали статической переменной-членом, но в Python это называется атрибутом класса, потому что оно уникально для класса.

name в классе Animal - это то, что вы бы назвали переменной-членом или экземпляром, а в Python это называется атрибутом экземпляра, потому что он уникален для каждого экземпляра класса.

Вы используете self для обозначения атрибутов в своем классе.

+0

Также обратите внимание, что использование «self» - это просто соглашение. Вы можете использовать «это», если вы действительно хотели (но не надо!) – juanchopanza

+0

Если честно, я новичок в любом программировании. Я только отметил OOP, потому что в книге, которую я использую, упоминается, что это основная идея, окружающая его. Означает ли это, что в python неправильно думать об атрибуте как переменной? – masiewpao

0

Прежде всего, разница между атрибутами класса и экземпляра предоставляется в другом месте.

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

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

self.foo может использоваться для доступа к атрибутам экземпляра или атрибутам класса (если атрибут экземпляра не существует).

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