Какой класс владеет методами и атрибутами - PullRequest
0 голосов
/ 01 октября 2011

Допустим, у нас есть этот код:

class C(CC):
  a = 1
  b = 2
  def __init__(self):
    self.x = None
    self.y = 1

Как я могу быстро узнать в Python, где определен атрибут или метод? Если он принадлежит классу предка или это метод класса C. Вы можете видеть атрибуты a, b, x, y. Должны ли они принадлежать к классу C? или они могут быть из классов предков? Когда тип присваивается переменной?

Почему бы не использовать

class C(CC):
  a = 1
  b = 2
  x = None
  y = 1

спасибо

Ответы [ 2 ]

4 голосов
/ 01 октября 2011

В первом примере a и b являются атрибутами объекта класса C.(Представьте себе «статические» атрибуты.) И x и y являются атрибутами экземпляров C.(Итак, обычные атрибуты экземпляра.)

Во втором примере все четыре являются атрибутами C, а не его экземпляров.

В Python вы не можете «объявлять» атрибуты, как определеноопределенным классом, что означает, что нет никаких определений атрибута, чтобы унаследовать для начала.(Более или менее, но я не собираюсь запутывать воду, вводя __slots__).Определения методов можно найти, выполнив поиск по имени «def method_name (»), а определения методов наследуются, как и в большинстве языков OO.

Смущает, что вы можете обращаться к атрибутам класса через экземпляры классазатем, если вы назначите новое значение этому атрибуту, будет создан новый атрибут экземпляра:

In [1]: class C(object): a=1
In [2]: c1 = C()

In [3]: c1.a
Out[3]: 1

In [5]: c1.__dict__
Out[5]: {}

In [6]: c1.a=2

In [7]: c1.__dict__
Out[7]: {'a': 2}

In [8]: c2 = C()

In [9]: c2.a
Out[9]: 1

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

1 голос
/ 01 октября 2011

Почему бы не использовать

class C(CC):
  a = 1
  b = 2
  x = None
  y = 1

Это , а не то же самое.Это имеет четыре атрибута уровня класса, которые являются общими для всех объектов класса C.

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

class C(CC):
  a = 1
  b = 2
  def __init__(self):
    self.x = None
    self.y = 1

Ваши два примера кода разные.Их нельзя сравнивать.

Чтобы ответить на ваш другой вопрос, мы используем GREP и другие инструменты для поиска источника.Это просто.

...