假设我们有这段代码:
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
谢谢
答案 0 :(得分:4)
在第一个示例中,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 :(得分: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和其他工具搜索来源。这很容易。