哪个类拥有方法和属性

时间:2011-10-01 14:11:42

标签: python inheritance attributes self

假设我们有这段代码:

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 个答案:

答案 0 :(得分:4)

在第一个示例中,ab是C类对象的属性。 (想想“静态”属性。)xy是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 :(得分:1)

为什么不使用

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和其他工具搜索来源。这很容易。