Python 類的名稱空間和組合


一、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.類可以調用對象的屬性嗎?

2.對象可以調用類屬性嗎?

通過上面的代碼可以看出,類無法訪問對象的屬性,由於對象和類之間存在一個關聯關系,所以對象能夠找到類。

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

使用對象.屬性名,現在對象自己的名稱空間內找,如果找不到,再到類的內存空間找。

對象修改類的靜態屬性

我們想象一個場景:媽媽和爸爸工作掙錢,然后把錢放在錢箱里,供一個家庭使用:

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中靜態屬性。

如果我們把 Home_Money設置成list,結果將會不同

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

只要使用靜態屬性,就必須使用類名去調用,盡量不要使用對象名。

#統計一個類被實例化次數
class Person():
    count = 0
    def __init__(self):
        Person.count += 1

alex = Person()
egon = Person()
xiaoming = Person()
laowang = Person()

print('實例化次數:%s' %Person.count)

二、對象組合

 求圓環的面積

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裝備等 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM