1. 程式人生 > >Python()-類命名空間和對象/實例命名空間

Python()-類命名空間和對象/實例命名空間

內存 屬性 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()-類命名空間和對象/實例命名空間