一:命名空間 python
class Person: Country = '中國人' # 靜態變量 print(Person.Country) alex = Person() # 建立了一個空的命名空間 alex.name = 'alex' # 對象 alex.Country = '泰國人' egon = Person() egon.name = 'egon' # 類名.靜態變量 對象.屬性名 # 類名能夠調用對象的屬性麼? 不能夠 # 對象能夠調用類中的屬性麼? 能夠 print(Person.Country) print(alex.Country) print(egon.Country)
打印結果app
注意:類名不能夠調用對象的屬性(不能清楚具體是哪一個對象屬性,兩個country)spa
對象名能夠調用類中的屬性(alex.country)對象
因爲對象和類之間存在一個關聯關係 因此對象可以找到類 可是 類不能找到對象
二:對象.屬性命名空間尋找(先在本身命名空間找,後再類命名空間找)索引
#使用類名.屬性 只會尋找類中的靜態變量名字 #使用對象.屬性 會先在對象本身的命名空間中找名字 # 若是找不到 再到類的內存空間中去找 class Person: Country = '中國人' # 靜態變量 alex = Person() egon = Person() print(alex.Country) alex.Country = '印度人' print(alex.Country) Person.Country # 只要你使用靜態變量 就用類名去調用
注意:當你使用靜態變量時候,就用類名去調用內存
例子1it
class Person: money = 0 mother = Person() father = Person() Person.money += 1000 Person.money += 1000 print(Person.money) print(mother.money) print(father.money)
打印結果:2000,2000,2000class
例子2import
class Person: money = [1] mother = Person() father = Person() mother.money[0] += 1000 [0]表示索引 father.money[0] += 1000 [0]表示索引 print(mother.money) print(father.money) print(Person.money)
打印結果 [2001],[2001],[2001]變量
注意:[0]表示索引,+= 1000 就是索引加。
例子3
class Person: money = [0] mother = Person() father = Person() mother.money = [1000] father.money = [2000] print(mother.money) print(father.money) print(Person.money)
打印結果:【1000】,【2000】,【0】 例子3中索引改變才讓調用類屬性改變,而本題沒有變化。
例子4
a = 1 a = 2 print(a) a = [1] a.append(2) print(id(a)) a[0] = 10 print(id(a)) print(a) a = [1] a = [2]
打印結果:2,40615688,40615688,【10,2】
例子5:
寫一個類,能統計這個類被多少個對象實例化了. 全部的對象共享這個結果 init 靜態變量 class Foo: num = 0 def __init__(self): Foo.num += 1 f1 = Foo() print(Foo.num) f2 = Foo() print(Foo.num) print(f1.num)
組合:圓和老師組合例題
組合 兩個類的事兒 什麼叫組合 : 一個類對象的屬性 是 另一個類的對象 兩個類的事兒 :類與類之間有一種"什麼有什麼的關係" 圓的類 圓環 和 圓 圓環 也是一個類 屬性 大圓半徑 和 小圓半徑 圓環 求面積 求周長
from math import pi class Circle: def __init__(self,r): self.r=r def area(self): return pi*(self.r**2) class Ring: def __init__(self,outer,inner): self.outer=Circle(outer) self.inner=Circle(inner) def area(self): return self.outer.area()-self.inner.area() r=Ring(10,3) c=Circle(11) print(Ring.area(r)) print(r.area())
例題:老師生日組合
參考答案
老師 name sex course(課程) birth 生日 年月日 class Birthday: def __init__(self,year,month,day): self.year = year self.month = month self.day = day class Teacher: def __init__(self,name,sex,course,birth): self.name = name self.sex = sex self.course = course self.birth = birth # birth是一個對象 birth = Birthday(1960,3,7) # birth 是Birthday類的一個對象 alex = Teacher('alex','male','python',birth) # alex.birth = birth # time '1960-3-7' # 老師的年齡 2018 - 1960 print(birth) import time if birth.month == time.localtime().tm_mon and \ birth.day == time.localtime().tm_mday: print('生日快樂') print(time.localtime().tm_year - birth.year)
本身寫:
class Birthday: def __init__(self,year,month,day): self.year=year self.month=month self.day=day class Teacher: def __init__(self,name,course,birth): self.name=name self.course=course self.birth=birth birth=Birthday(1960,4,4) zhen=Teacher('zhen','python',birth) # print(Birthday.year()) print(zhen.birth.year) print(birth.year)