Python 類的名稱空間和組合

1、Python類的名稱空間

class Student(object):
    School = '北京大學'
    def __init__(self):
        pass

stu1 = Student()
stu1.name = '小明'
print(stu1.School)
print(Student.name) #error  type object 'Student' has no attribute 'name'

1.類能夠調用對象的屬性嗎?python

2.對象能夠調用類屬性嗎?spa

經過上面的代碼能夠看出,類沒法訪問對象的屬性,因爲對象和類之間存在一個關聯關係,因此對象可以找到類。code

使用類名.屬性名,只能尋找類中的靜態屬性名對象

使用對象.屬性名,如今對象本身的名稱空間內找,若是找不到,再到類的內存空間找。blog

對象修改類的靜態屬性

咱們想象一個場景:媽媽和爸爸工做掙錢,而後把錢放在錢箱裏,供一個家庭使用:內存

class Person(object): Home_Money = 0 def __init__(self): pass mother = Person() mother.Home_Money += 1000 father = Person() father.Home_Money += 1000

print(mother.Home_Money) #1000
print(father.Home_Money) #1000
print(Person.Home_Money) #0

經過上面代碼,Person中的Home_Money仍是0,這是由於  對象.屬性名 = 1000 是賦值操做,只是給對象添加了一個屬性,並無修改Person中靜態屬性。it

若是咱們把 Home_Money設置成list,結果將會不一樣class

class Person(object): Home_Money = [0] def __init__(self): pass mother = Person() mother.Home_Money[0] +=  1000 father = Person() father.Home_Money[0] +=  1000

print(mother.Home_Money) #2000 
print(father.Home_Money) #2000
print(Person.Home_Money) #2000

只要使用靜態屬性,就必須使用類名去調用,儘可能不要使用對象名。import

#統計一個類被實例化次數
class Person(): count = 0 def __init__(self): Person.count += 1 alex = Person() egon = Person() xiaoming = Person() laowang = Person() print('實例化次數:%s' %Person.count)

2、對象組合

 求圓環的面積object

from math import pi class Ring(): def __init__(self,R,r): self.R = R self.r = r def area(self): return pi*(self.R**2) - pi*(self.r**2) def perimeter(self): return 2*pi*self.R +  2*pi*self.r ring = Ring(10,5) print(ring.area()) #235.61944901923448 print(ring.perimeter()) #94.24777960769379

使用對象組合重寫寫一遍求圓環的面積和周長

class Ring(): def __init__(self,out,inner): self.out = Circle(out) # 一個類的對象屬性 = 另外一個類的對象
        self.inner = Circle(inner) def area(self): return self.out.area() - self.inner.area() def perimeter(self): return self.out.perimeter() + self.inner.perimeter() ring = Ring(10,5) print(ring.area()) print(ring.perimeter())

何時使用面向對象組合: 類與類之間有一種"什麼有什麼的關係" --> 圓環裏有,學生類中與生日類,人物擁有xx裝備等 

相關文章
相關標籤/搜索