对象的属性
首先要理解的是“實例變量”。
我們在__init__方法中并不是創建了實例變量,我們是添加了一個或者多個屬性給實際的對象
在__init__內部 self.x = 5和外部 f.x = 5沒有什么不同。
?
那么類呢?
1 >>> class Bar(object): 2 pass 3 4 >>> Bar.foo = 100 5 >>> Bar.foo 6 100 7 >>> Bar 8 <class '__main__.Bar'>類也是對象,所以它也有屬性。但是有一個疑問。我們可以為每一個實例對象定義一個屬性通過__init__方法。
那創建一個類的屬性,是怎么樣的?
答案很簡單。函數內部的代碼塊和類的代碼塊。函數的內部代碼只有當函數觸發是才會執行,類的代碼塊是在類定義好后就執行的,只執行一次
1 >>> class Foo(): 2 print("hello") 3 4 5 hello 6 >>> 1 >>> class Foo(): 2 x = 100 3 4 5 >>> Foo.x 6 100?
如果我們定義了一個函數,我只是在當前作用域創建了一個變量,如果在類里面定義一個方法,其實是創建了一個新的屬性
1 >>> class Foo(): 2 def blah(self): 3 return "blash" 4 5 6 >>> Foo.blah 7 <unbound method Foo.blash>?
換句話說,實例的方法在類里面,不在實例對象上,當我們觸發f.blah()時,相當于這樣f.blah()和Foo.blah(f)
?
如果我觸發f.blah(),python怎么知道去觸發Foo.blah?? f和Foo是完全兩個不同的對象。f是Foo的實例對象,Foo是type的實例對象,python是如何找到Foo的blah屬性的呢?
?
python有不同的規則用于變量和屬性區域,對于變量,python遵守LEGB規則:本地,閉合,全局,內建。
對于屬性,首先它會在對象上尋找,然后再去尋找這個對象的類,然后去尋找這個類的父類。知道尋找到object類
因此f.blah(),先找實例對象f,沒有找到屬性名blah,去找這個類Foo,在這里找到了然后通過一些方法執行Foo.blah(f)
?
所以python沒有實際上的類變量和實例變量之分。有的只是對象的屬性。一些事定義在類本身上。一些是建立在類的實例對象上。(當然,類也是type的實例對象,現在往我們忘記它)。這也是為什么一些人認為他們應該定義類上的屬性(類變量)。因為它們對實例對象時可見的。
?
最后來看一下代碼
1 >>> class Person(): 2 population = 0 3 def __init__(self, f, s): 4 self.f = f 5 self.s = s 6 self.population +=1 7 8 9 >>> p1 = Person('s','ss') 10 >>> p2 = Person('a', 'aa') 11 >>> p1.population 12 1 13 >>> p1.population 14 1 15 >>> p2.population 16 1 17 >>> Person.population 18 0?
轉載于:https://www.cnblogs.com/jypwn/p/4033941.html
總結
- 上一篇: android地图实时标记
- 下一篇: SEL selector (二)