類命名空間
在一個類中它的函數(方法)屬于動態屬性,直接定義的變量屬于靜態屬性
首先先定義一個類,并在這個類里面加入靜態變量、屬性等然后將一個對象實例化
class
Fighter:
#
定義一個戰機的類
price = 5000
#
靜態變量
def
__init__
(self,name,speed,atk,hp):
self.name
=
name
self.speed
=
speed
self.atk
=
atk
self.hp
=
hp
def
Attack(self):
print
(
'
本次攻擊造成了%s的傷害
'
%
(self.atk))
f1
= Fighter(
'
J-20
'
,1000,400,5000
)
print
(f1.
__dict__
)
#
{'name': 'J-20', 'speed': 1000, 'atk': 400, 'hp': 5000}
那如何修改一個靜態屬性,我們可以用類名.靜態變量名等于我們想要賦值的內容就可以修改
Fighter.price = 4500
print
(Fighter.
__dict__
)
#
{'__module__': '__main__', 'price': 4500,
'__init__':
,
'Attack':
,
'__dict__':
,
'__weakref__':
, '__doc__': None}
如果我們用__dict__方法去修改結果是不行的
Fighter.
__dict__
[
'
price
'
] = 2500
print
(Fighter.
__dict__
)
#
TypeError: 'mappingproxy' object does not support item assignment
關系圖:
當我們使用f1.price的時候,f1會先在自己的命名空間去找,它會發現自己的內存空間里沒有這個price,然后在通過類對象指針找到Fighter的命名空間,取得price這個變量
而Fighter.price是直接從自己的命名空間中取得,找到就返回
注意:只有實例化出來的對象才能找到類,而類并不能找到每一個對象
?
如果我們想用實例化出來的一個對象去修改類里面的靜態變量,該怎么做?
可以看出在這里直接修改這個靜態變量我們并沒有修改成功,而是在我們的這個self;'字典'里新增了一個price屬性
f1.price = 4500
print
(f1.
__dict__
)
#
{'name': 'J-20', 'speed': 1000, 'atk': 400, 'hp': 5000, 'price': 4500}
print
(Fighter.
__dict__
)
#
{'__module__': '__main__', 'price': 5000,
'__init__':
,
'
Attack
'
:
,
'
__dict__
'
:
'
__dict__
'
of
'
Fighter
'
objects>
,
'
__weakref__
'
:
'
__weakref__
'
of
'
Fighter
'
objects>,
'
__doc__
'
: None}
那么再想用回類里面的靜態變量的話只能刪除price
del
f1.price
print
(f1.price)
#
5000
print
(f1.
__dict__
)
#
{'name': 'J-20', 'speed': 1000, 'atk': 400, 'hp': 5000}
對于像上面這種不可變數據類型而言,類變量最好用類操作
現在我們把這個靜態變量改成列表的類型, 可以看到我們運用修改索引值的方式成功修改了原來的列表的元素
class
Fighter:
#
定義一個戰機的類
price = [5000]
#
靜態變量
def
__init__
(self,name,speed,atk,hp):
self.name
=
name
self.speed
=
speed
self.atk
=
atk
self.hp
=
hp
def
Attack(self):
print
(
'
本次攻擊造成了%s的傷害
'
%
(self.atk))
f1
= Fighter(
'
J-20
'
,1000,400,5000
)
f1.price[0]
= 6000
print
(f1.
__dict__
)
#
{'name': 'J-20', 'speed': 1000, 'atk': 400, 'hp': 5000}
print
(Fighter.
__dict__
)
#
{'__module__': '__main__', 'price': [6000], '__init__':
,
'
Attack
'
:
,
'
__dict__
'
:
'
__dict__
'
of
'
Fighter
'
objects>
,
'
__weakref__
'
:
'
__weakref__
'
of
'
Fighter
'
objects>,
'
__doc__
'
: None}
這是因為像這種可變數據類型(列表),它所改變的值不影響它本身的內存地址,像price它所指向的還是列表這個內存地址,所以改變了它的內部的值不會有太大的影響
但是如果我們這樣寫的話就相當于開辟了一個新的內存空間存放新的列表了
f1.price = [6000
]
print
(f1.
__dict__
)
#
{'name': 'J-20', 'speed': 1000, 'atk': 400, 'hp': 5000, 'price': [6000]}
print
(Fighter.
__dict__
)
#
{'__module__': '__main__', 'price': [5000], '__init__':
,
'Attack':
,
'__dict__':
,
'__weakref__':
, '__doc__': None}
最后靜態變量和函數名不要相同
一個例子: 創建一個類,每實例化一個對象就計數,最終所有的對象都共享這個數據
class
Counter():
count
=
0
def
__init__
(self):
Counter.count
+= 1
print
(Counter.count)
#
0
c1 =
Counter()
print
(Counter.count)
#
1
c2 =
Counter()
print
(Counter.count)
#
2
綁定方法:
一個類沒有__init__也可以實例化,self仍能把自己傳給f1
class
Person:
def
fuc(self):
print
(
'
Walking...
'
)
f1
=
Person()
print
(f1.
__dict__
)
#
{}
f1.fuc()
#
Walking...
現在再定義一個函數
def
func():
print
(
'
Testing...
'
)
class
Person:
def
fuc(self):
print
(
'
Walking...
'
)
f1
=
Person()
print
(func)
#
print
(Person.fuc)
#
print
(f1.fuc)
#
<__main__.Person object at 0x0000000002737A58>>
print
(f1)
#
<__main__.Person object at 0x0000000002737A58>
當對象去調用方法的時候就是把里面的值傳給這個方法那么他們之間就發生了一種綁定關系
import
當我們引入一個包的時候就相當于實例化了一個對象
?
組合
表示在一個類中以另外一個類的對象作為數據屬性,稱為類的組合
我們先聲明三個類玩家的戰機類、敵機的類和武器的類:
class
Fighter:
#
定義一個玩家戰機的類
def
__init__
(self,name,atk,hp,speed,money):
self.name
=
name
self.atk
=
atk
self.hp
=
hp
self.speed
=
speed
self.money
=
0
def
playerAttack(self,enemyfighter):
enemyfighter.hp
-=
self.atk
class
EnemyFighter:
#
定義個敵機的類
def
__init__
(self,name,atk,hp,speed,kind):
self.name
=
name
self.atk
=
atk
self.hp
=
hp
self.speed
=
speed
self.kind
=
kind
def
enemyFighterAttack(self,fighter):
fighter.hp
-=
self.atk
class
Weapon:
#
定義一個武器的類
def
__init__
(self,name,atk,durability,price):
self.name
=
name
self.atk
=
atk
self.durability
=
durability
self.price
=
price
playerFighter1
= Fighter(
'
Player1
'
,200,1500,300
,0)
Boss1
= EnemyFighter(
'
lazerBoss
'
,1000,7000,50,
'
Boss
'
)
w1
= Weapon(
'
AMR-123
'
,1000,10,300
)
print
(w1.
__dict__
)
#
{'name': 'AMR-123', 'atk': 1000, 'durability': 10, 'price': 300}
print
(Boss1.
__dict__
)
#
{'name': 'lazerBoss', 'atk': 1000, 'hp': 7000, 'speed': 50, 'kind': 'Boss'}
print
(playerFighter1.
__dict__
)
#
{'name': 'Player1', 'atk': 200, 'hp': 1500, 'speed': 300, 'money': 0}
如何將我們的裝備裝備到我們玩家的戰機上?在玩家的身上寫一個get_weapon函數讓一個武器的對象作為參數傳給這個函數,再讓玩家或得到武器的這些屬性
class
Fighter:
#
定義一個玩家戰機的類
def
__init__
(self,name,atk,hp,speed,money =
0):
self.name
=
name
self.atk
=
atk
self.hp
=
hp
self.speed
=
speed
self.money
=
money
def
playerAttack(self,enemyfighter):
enemyfighter.hp
-=
self.atk
def
get_weapon(self,weapon):
#
玩家獲得武器屬性的函數
if
self.money >= weapon.price:
#
如果玩家的金錢大于武器的價格
self.money -=
weapon.price
self.weapon
= weapon
#
給玩家添加武器的屬性
self.hp +=
weapon.maxHp
self.atk
+=
weapon.atk
else
:
print
(
'
余額不足請先充值!
'
)
class
EnemyFighter:
#
定義個敵機的類
def
__init__
(self,name,atk,hp,speed,kind):
self.name
=
name
self.atk
=
atk
self.hp
=
hp
self.speed
=
speed
self.kind
=
kind
def
enemyFighterAttack(self,fighter):
fighter.hp
-=
self.atk
class
Weapon:
#
定義一個武器的類
def
__init__
(self,name,atk,maxHp,durability,price):
self.name
=
name
self.atk
=
atk
self.maxHp
=
maxHp
self.durability
=
durability
self.price
=
price
playerFighter1
= Fighter(
'
Player1
'
,200,1500,300,500
)
Boss1
= EnemyFighter(
'
lazerBoss
'
,1000,7000,50,
'
Boss
'
)
w1
= Weapon(
'
AMR-123
'
,1000,1000,10,300
)
print
(playerFighter1.
__dict__
)
#
{'name': 'Player1', 'atk': 200, 'hp': 1500, 'speed': 300, 'money': 500}
playerFighter1.get_weapon(w1)
print
(playerFighter1.
__dict__
)
#
{'name': 'Player1', 'atk': 1200, 'hp': 2500, 'speed': 300, 'money': 200,
'weapon':<__main__.Weapon object at 0x000000000280D518>}
現在我們給武器設計一個招數,給怪物一個致命一擊
class
Fighter:
#
定義一個玩家戰機的類
def
__init__
(self,name,atk,hp,speed,money =
0):
self.name
=
name
self.atk
=
atk
self.hp
=
hp
self.speed
=
speed
self.money
=
money
def
playerAttack(self,enemyfighter):
enemyfighter.hp
-=
self.atk
def
get_weapon(self,weapon):
#
玩家獲得武器屬性的函數
if
self.money >= weapon.price:
#
如果玩家的金錢大于武器的價格
self.money -=
weapon.price
self.weapon
= weapon
#
給玩家添加武器的屬性
self.hp +=
weapon.maxHp
self.atk
+=
weapon.atk
else
:
print
(
'
余額不足請先充值!
'
)
class
EnemyFighter:
#
定義個敵機的類
def
__init__
(self,name,atk,hp,speed,kind):
self.name
=
name
self.atk
=
atk
self.hp
=
hp
self.speed
=
speed
self.kind
=
kind
def
enemyFighterAttack(self,fighter):
fighter.hp
-=
self.atk
class
Weapon:
#
定義一個武器的類
def
__init__
(self,name,atk,maxHp,durability,price):
self.name
=
name
self.atk
=
atk
self.maxHp
=
maxHp
self.durability
=
durability
self.price
=
price
def
lazerBullet(self,enemyFighter,fighter):
if
self.durability >
0:
enemyFighter.hp
-= self.atk*2 +
fighter.atk
self.durability
-= 5
else
:
print
(
'
您的武器耐久度為0,不可再使用!請重新充值!
'
)
playerFighter1
= Fighter(
'
Player1
'
,200,1500,300,500
)
Boss1
= EnemyFighter(
'
lazerBoss
'
,1000,7000,50,
'
Boss
'
)
w1
= Weapon(
'
AMR-123
'
,1000,1000,10,300
)
#
初始的怪物和玩家屬性
print
(Boss1.
__dict__
)
#
{'name': '
lazerBoss
', 'atk': 1000, 'hp':
7000
, 'speed': 50, 'kind': 'Boss'}
print
(playerFighter1.
__dict__
)
#
{'name': '
Player1
', 'atk':
200
, 'hp':
1500
, 'speed': 300, 'money':
500
}
#
玩家裝備上武器后屬性
playerFighter1.get_weapon(w1)
print
(playerFighter1.
__dict__
)
#
{'name': '
Player1
', 'atk':
1200
, 'hp':
2500
, 'speed': 300, 'money':
200
,
'weapon': <__main__.Weapon object at 0x000000000280D518>}
#
第一回合玩家用武器大招攻擊
playerFighter1.weapon.lazerBullet(Boss1,playerFighter1)
print
(Boss1.
__dict__
)
#
{'name': '
lazerBoss
', 'atk': 1000, 'hp':
3800
, 'speed': 50, 'kind': 'Boss'}
#
第二回合Boss攻擊玩家
Boss1.enemyFighterAttack(playerFighter1)
print
(playerFighter1.
__dict__
)
#
{'name': '
Player1
', 'atk':
1200
, 'hp':
1500
, 'speed': 300, 'money': 200,
'weapon': <__main__.Weapon object at 0x000000000279D4A8>}
#
第三回合玩家用武器大招攻擊
playerFighter1.weapon.lazerBullet(Boss1,playerFighter1)
print
(Boss1.
__dict__
)
#
{'name': '
lazerBoss
', 'atk': 1000, 'hp':
600
, 'speed': 50, 'kind': 'Boss'}
playerFighter1.weapon.lazerBullet(Boss1,playerFighter1)
#
您的武器耐久度為0,不可再使用!請重新充值!
print
(Boss1.
__dict__
)
#
{'name': 'lazerBoss', 'atk': 1000, 'hp': 600, 'speed': 50, 'kind': 'Boss'}
?
組合練習
1.用組合的方法求這個圖形的面積,假設這里大圓半徑為10,小圓半徑為
from
math
import
pi as P
class
Cicle:
def
__init__
(self,r):
self.r
=
r
def
S(self):
return
P*self.r**2
def
L(self):
return
2*P*
self.r
class
Ring:
def
__init__
(self,outside_r,inside_r):
self.outside_c
=
Cicle(outside_r)
self.inside_c
=
Cicle(inside_r)
def
ret_S(self):
return
self.outside_c.S() -
self.inside_c.S()
def
ret_L(self):
return
self.outside_c.L() +
self.inside_c.L()
ring
= Ring(10,5
)
print
(ring.ret_S())
#
235.61944901923448
print
(ring.ret_L())
#
94.24777960769379
2.創建一個老師類,老師有生日、課程,生日和課程可以是一個類,用組合的方式表示
class
Teacher:
def
__init__
(self,name,age,gender,course,birthday):
self.name
=
name
self.age
=
age
self.gender
=
gender
self.course
=
course
self.birthday
=
birthday
class
Course:
def
__init__
(self,name,price,period):
self.name
=
name
self.price
=
price
self.period
=
period
class
Birthday:
def
__init__
(self,year,month,day):
self.year
=
year
self.month
=
month
self.day
=
day
p1
= Teacher(
'
Jackson
'
,25,
'
male
'
,Course(
'
python
'
,15000,
'
7 months
'
),Birthday(1994,6,12
))
print
(p1.
__dict__
)
#
{'name': 'Jackson', 'age': 25, 'gender': 'male',
'course': <__main__.Course object at 0x00000000024AD390>,
'birthday': <__main__.Birthday object at 0x00000000024AD400>}
print
(p1.course.name,p1.course.price,p1.course.period)
#
python 15000 7 months
print
(p1.birthday.year,p1.birthday.month,p1.birthday.day)
#
1994 6 12
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

