面向對象進階2 組合

一:命名空間 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)
相關文章
相關標籤/搜索