Что такое «атрибуты объекта» в python и вообще? - PullRequest
2 голосов
/ 12 марта 2019

Я изучаю Python, и одна из обучаемых встроенных функций - dir() - курс описывает это как , 'возвращающий каталог допустимых атрибутов для объекта,' , но что атрибуты объекта?

Я думаю, что я вижу некоторые функции-члены в возвращенном списке атрибутов, __len__ Я предполагаю, что относится к len(), но что все эти другие вещи перечислены?

Course description

Кроме того, что это значит, оно может быть неполным?

Это мой первый вопрос, и я бы не стал его задавать, если бы не потратил 45 минут, пытаясь это выяснить.

Ответы [ 4 ]

2 голосов
/ 12 марта 2019

Допустим, у вас есть класс Person

class Person:
    name = "Samuel"
    age = 50
    country = "India"

    def method1(self):
        print("Method 1")

print(dir(Person))

Вывод вышеуказанной программы выглядит следующим образом:

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', 
'__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__',
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', 
'__str__', '__subclasshook__', '__weakref__', 
'age', 'country', 'method1', 'name']

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

имя, возраст, страна являютсяатрибуты и method1 является методом этого класса.Следовательно, когда вы используете dir (Person), он отобразит все атрибуты этого класса.

Механизм dir () по умолчанию ведет себя по-разному с различными типами объектов, так как он пытается создать наиболее релевантный, а неполная информация:

  • Если объект является объектом модуля, список содержит имена атрибутов модуля.
  • Если объект является объектом типа или класса, список содержитимена его атрибутов и рекурсивные атрибуты его баз.
  • В противном случае список содержит имена атрибутов объекта, имена атрибутов его класса и рекурсивно атрибуты базовых классов его класса.

Например,

a = [1,2,3,45]
print(dir(a))

Будет напечатано:

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', 
 '__dir__', '__doc__', '__eq__', '__format__', '__ge__', 
 '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', 
 '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', 
 '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', 
 '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', 
 '__setattr__', '__setitem__', '__sizeof__', '__str__', 
 '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 
 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

Здесь вы можете увидеть несколько других имен атрибутов insert, pop,удалить и т. д. Если вы проверите с предыдущим списком, они не присутствовали. Это потому, что разные типы объектов имеют разные атрибуты , и с этими атрибутами вы можете использовать эти объекты в разных формах.Вы можете использовать a.pop(2) для удаления элемента и т. Д.

len Я полагаю, относится к len ()

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

Я думаю, что я вижу некоторые функции-члены в возвращенном списке атрибутов, len Я предполагаю, что относится к len (), но что это за вседругие вещи в списке?

Посетите следующую ссылку, https://docs.python.org/3.6/reference/datamodel.html#object.dir. Большинство из них перечислены здесь.Там также описано использование.

0 голосов
/ 12 марта 2019

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

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

Скажем, вы вызвали len([1,2,3,4]), это вызовет метод __len__(), который присутствует внутри класса List Т.е. класса, из которого был создан этот объект списка.

Различные функции используют эти dunder методы для своих собственных целей.

вот пример

class Test:
    def __myfunc__(self):
        return "I have been called"

def testFunc(object):
    return object.__myfunc__()

test = Test()

testFunc(test)

«Меня назвали»

Так же, как и многие из этих функций.

0 голосов
/ 12 марта 2019

Вы путаете несколько вещей и, возможно, вас смущают некоторые вещи.

__len__ не относится к len(), скорее len(something) вызовет __len__ метод something.Любой объект, у которого есть метод __len__, может быть запрошен для определения его длины, вызвав len(something).Обратите внимание, что это отличается от something.len() и как оно более разборчиво, чем something.__len__().

Атрибуты объекта в Python включают то, что вы обычно рассматриваете как его атрибуты, а также все его свойства и имена методов,Так для этого примера:

class T:
    def __init__(self):
        self.x = 10

    def afunc(self):
        return 20

    @property
    def y(self):
        return self.x

Любой экземпляр T будет включать в свои атрибуты x, afunc и y.Атрибуты объекта также включают в себя все атрибуты его базовых классов (то есть, от каких классов он наследует), в конечном итоге всегда включая атрибуты object.

Замечание о том, что оно неполное, относится к объектам, которыене имеет атрибута __dir__ для вызова функцией dir().В этих случаях функция dir() будет проверять свой атрибут __dict__ (если он доступен) и в результате может не предлагать полный список атрибутов - обратите внимание, что это не относится к большинству объектов.

0 голосов
/ 12 марта 2019

Зависит от того, о каком типе объекта вы говорите.Скажем, рассматриваемый объект является классом, тогда все атрибуты, которые входят в пространство имен класса, перечислены dir.И это включает любые методы, переменные уровня класса, которые специально объявлены пользователем + все, что наследуется.Помните, что классы наследуются от объекта, который предоставляет набор специальных методов

Посмотрите, имеет ли смысл приведенный ниже код:

class A(object):
    def __init__(self, a):
        self.a = a
    def m(self):
        print("in method")
    @property
    def p(self):
        print("in prop")
    def __get__(self, obj, owner):
        print("in get")
        return self
    def __call__(self, *args):
        print("call")

Если вы выполните команду dir для класса A, вы увидите все атрибуты впространство имен A + наследуется от объекта, как показано ниже.Также попробуйте dir (object), чтобы увидеть, какие конкретно атрибуты 'object'

['__call__',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__get__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'm',
 'p']

Обратите внимание, что self.a не указан, поскольку self.a принадлежит экземпляру, а не самому классу

Чтобы добавить, ваши номера объектов имеют тип list, и, следовательно, перечислены все атрибуты списка (см. Dir (список))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...