Python()-類命名空間和對象/實例命名空間
阿新 • • 發佈:2018-03-09
內存 屬性 pre 綁定 IT 就會 clas self elf
類命名空間和對象/實例命名空間:
創建類, 就會創建一個類的名稱空間, 空間:存儲類的屬性
屬性:
- 靜態屬性:直接定義在類下面 & 和類名關聯 的變量
- 對象屬性:在類內和self關聯 & 類外和對象關聯 的變量
- 動態屬性:方法(函數)
內存空間的指向:
class Foo: a = 1 b = [‘big‘] def __init__(self): pass f1 = Foo() print(f1.a) # 1 f1.a = 2 # ‘=‘ 斷開了類的指針,內存地址不在指向類中的a (從內存層面講) , 指向了新開辟的空間 # 對象修改類的不可變數據類型,,只是賦值在對象自己的空間裏增加一個新屬性print(f1.a) # 2 print(f1.b) # [‘big‘] f1.b.append(‘small‘) #沒有斷開,只是指向的列表append() # 對象修改可變數據類型,全局生效 print(f1.b) # [‘big‘, ‘small‘]
========
class Foo: def func(self): return 100 f = Foo() print(f.func()) f.func = 1 #修改成1, 對象自己創建了一個變量名是func = 1 的東西 print(f.func) #f.func 沒有括號,是對象調用屬性 print(Foo.func(f)) #如果還想用 100, 可以用類名.方法,self參數必須傳進去一個對象
================
例子:統計類被調用的次數
class Foo: count = 0 def __init__(self): Foo.count += 1 f = Foo() print(f.count) #1 Foo.count f2 = Foo() print(f2.count) #2 Foo.count f3 = Foo() print(f3.count) #3 Foo.count f = Foo() f2 = Foo() f3 = Foo() print(f.count) # 3 Foo.count print(f2.count) # 3 Foo.count print(f3.count) # 3 Foo.count
===============================
題外:
class Foo: count = 0 def __init__(self): Foo.count += 1 def func(self): a = 3 f = Foo() print(Foo.func) #<function Foo.func at 0x0000000001E68950> print(f.func) 兩個內存地址是不一樣的,(因為bound綁定到對象,有個類的指針指向類的方法,不是直接去拿) #<bound method Foo.func of <__main__.Foo object at 0x0000000001E67B38>>
================
命名空間:
- 靜態屬性: 屬於類內部的命名空間
- 動態屬性: 屬於類內部的命名空間
- 對象屬性: 屬於對象的,在類內關聯self ,類外關聯對象名
查看靜態屬性: 類名.屬性 對象.屬性
調用類中的方法: 類名.方法名(傳對象) ,對象.方法名()
對象能找到類,類找不到對象,單線聯系
對象查找屬性,現在自己空間找,找不到再去類空間去找
Python()-類命名空間和對象/實例命名空間