Я работаю над тем, чтобы научиться программировать на Python и сосредоточен на том, чтобы лучше понять, как использовать стандартные и другие модули. Функция dir кажется действительно мощной в интерпретаторе, но мне интересно, что я что-то упустил из-за отсутствия фона ООП. Используя книгу С.Лоттса, я решил использовать его класс Die, чтобы больше узнать о синтаксисе и использовании классов и экземпляров.
Вот оригинальный код:
class Die(object):
''' simulate a six-sided die '''
def roll(self):
self.value=random.randrange(1,7)
return self.value
def getValue(self):
return self.value
Я смотрел на это, и после создания некоторых экземпляров я подумал, является ли слово value каким-то образом ключевым словом и как это делает использование объекта word в выражении класса, и поэтому я решил выяснить, изменив определение класса на следующее:
class Die():
''' simulate a six-sided die '''
def roll(self):
self.ban=random.randrange(1,7)
return self.ban
def getValue(self):
return self.ban
Это изменение показало мне, что я получал то же поведение в своих экземплярах, но в тех случаях, когда я выполнял команду dir, отсутствовали следующие методы / атрибуты:
'__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__',
'__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
_repr__', '__setattr__', '__str__', '__weakref__'
Я также понял, что когда я делал dir для экземпляра, у меня было дополнительное ключевое слово - ban , которое я, наконец, понял, было атрибутом моего экземпляра. Это помогло мне понять, что я могу использовать d1.ban для доступа к значению моего экземпляра. Единственная причина, по которой я смог выяснить, что это атрибут, - я набрал d1.happy и получил AttributeError Я понял, что d1.GetValue - это метод привязанный к Die, потому что это то, что сказал мне переводчик.
Поэтому, когда я пытаюсь использовать какой-то сложный, но полезный модуль, например BeautifulSoup, как я могу узнать, какие из перечисленных вещей являются атрибутами моего экземпляра или методами моего экземпляра после ввода dir (instance), Мне нужно было бы знать это, потому что это возрождение научило меня, что с атрибутами я вызываю результат метода, а с методами я вызываю функцию в моем экземпляре.
Этот вопрос, вероятно, слишком многословен, но, несомненно, помог мне лучше понять разницу между атрибутами и методами. В частности, когда я смотрю на результат вызова dir для экземпляра моего класса Die, я вижу это
['__doc__', '__module__', 'ban', 'getValue', 'roll']
Так что было бы полезно узнать, посмотрев в этот список, какие атрибуты и методы являются необходимыми, без необходимости прибегать к методам проб и ошибок или в результате набрать hasattr (myInstance, suspectedAttributeName) .
После размещения вопроса я попробовал
for each in dir(d1):
print hasattr(d1,each)
, который строго говорит мне, что все методы являются атрибутами. но я не могу вызвать метод без () , поэтому мне кажется, что hasattr () вводит в заблуждение.