1. 程式人生 > >python面向對象之靜態屬性/靜態方法/類方法/組合

python面向對象之靜態屬性/靜態方法/類方法/組合

int html pan 定義 都是 itl 接口繼承 操作 icm

#!/usr/bin/env python
# coding:utf-8

class Campus:

    def __init__(self,name,addr,type):
        self.Name = name
        self.Addr = addr
        self.Type = type

    def details(self):
        print("學樣的詳細信息, 名稱:%s 地址:%s 類型:%s" %(self.Name,self.Addr,self.Type) )


c1 = Campus("南京大學","江蘇南京","985")
print(c1.__dict__)
print(Campus.__dict__)  # 註意實例字典與類的字典的區別

c1.details()
Campus.details(c1)  # 使用類去調用方法時,需要傳入具體的實例參數


#### 也推薦看看廖雪峰的教程: https://www.bilibili.com/video/av3803706?from=search&seid=6691387782253130457

#####
class Room:
    clr = ‘可選的,默認白色‘
    def __init__(self,name,owner,width,length,height):
        self.name = name
        self.owner = owner
        self.width = width
        self.length = length
        self.height = height

    def area(self):
        return self.width * self.length

    @property # 此裝飾器就是負責把一個方法變成靜態屬性調用
    def space(self):
        return self.width * self.length * self.height

    @classmethod # 供類使用的方法,雖然實例也可以調用
    def colour(cls): # 此 cls 表示自動傳遞類名作為參數
        print("房間的色彩是",cls.clr)

    @staticmethod # 比喻為類的工具包. 只是名義上的歸屬類管理,不能使用類變量和實例變量
    def round(a,b):
        print("地板使用%s或%s"%(a,b))

    ## 靜態屬性既可以訪問實例屬性,又可以訪問類的屬性
    ##  類方法  不能訪問到實例的屬性
    ## 靜態方法  不能訪問類的屬性,也不能訪問實例的屬性
    # self跟實例綁定, cls跟類綁定, @staticmethod 跟誰都不綁定

r1 = Room(‘公寓‘,‘alex‘,9,9,2)
r2 = Room(‘house‘,‘jerry‘,12,13,5)

print(r1.area())
print(r2.area())

print("空間:",r1.space)  # 調用方法不一樣了,省掉括號
print("空間:",r2.space)  # @property的好處是封裝一個屬性, 使用時完全感知不到背後的邏輯

Room.colour() # 跟實例沒有關系,只是類調用自己的函數. 類級別的操作.

Room.round(‘木板‘,‘瓷磚‘)
r1.round("牛皮","水泥")  # 類或實例都可以調用

## 學著學著感覺到累了, 就去B站找了下以前喜歡的視頻:
## 磚家 "你不知道的西遊記" https://www.bilibili.com/video/av3803706?from=search&seid=6691387782253130457
## 這個系列的解說真是精彩, 以前在UKu上看過, 強力推薦給剛入社會的年輕人們看看.
技術分享圖片

組合:

技術分享圖片
#!/usr/bin/env python
# coding:utf-8

# class Hand:
#     pass
#
#
# class Foot:
#     pass
#
# #
# class Trunk:
#     pass
#
#
# class Head:
#     pass
#
#
# class Person:
#     def __init__(self, id_num, name):
#         self.id_num = id_num
#         self.name = name
#         self.hand = Hand() # 使用小類的實例化
#         self.foot = Foot()
#         self.trunk = Trunk()
#         self.head = Head()
#
#
# p1 = Person(‘111111‘, ‘alex‘)
# print(p1.__dict__)



# ## 類的組合:組合指的是,在一個類中以另外一個類的對象作為數據屬性,稱為類的組合
# ## 參考: http://www.cnblogs.com/linhaifeng/articles/7340153.html
class School:
    def __init__(self,name,addr):
        self.name = name
        self.addr = addr


class Course:
    def __init__(self,name,price,period,school):
        self.name = name
        self.price = price
        self.period = period
        self.school = school

class Teacher:
    def __init__(self,name,age,gender,):
        self.name = name
        self.age = age
        self.gender = gender


s1 = School("Mooc",‘北京‘)
s2 = School("Mooc",‘上海‘)
s3 = School("Mooc",‘線上‘)


msg = ‘‘‘
    1 xx學院 新校區
    2 xx學院 老校區
    3 xx學院 網絡校區
‘‘‘

while True:
    print(msg)
    menu={
        ‘1‘:s1,
        ‘2‘:s2,
        ‘3‘:s3
    }
    choice = input("選擇學校:")
    school_obj = menu[choice]

    n_name = input("課程名:")
    n_price = input("課程價格:")
    n_period = input("課程周期:")


    new_course= Course(n_name,n_price,n_period,school_obj)
    print("課程[%s]屬於[%s]學校,費用[%s]" %(new_course.name,new_course.school.name,new_course.price))
技術分享圖片

雖然這些都是小練習,與實際生產還有很大差距,但是沒有這些練習的熟練掌握,怎麽能玩轉實際生產呢?

繼續!

抽象類與接口練習:

技術分享圖片
#!/usr/bin/env python
# coding:utf-8

import abc #利用abc模塊實現抽象類(沒錯,就叫abc)

class All_file(metaclass=abc.ABCMeta): # 定義成基類
    @abc.abstractmethod  # 用裝飾器的方式定義抽象方法,無需實現功能
    def read(self):
        pass # 基類方法不用實現 子類必須定義功能
    @abc.abstractmethod
    def write(self):
        pass

## 接口繼承:就是定義了一個父類,規定了所有的子類必須實現父類的方法,但是父類不實現。並不是為了節省代碼

## 子類繼承時必須實現具體地實現基類規定的方法,不實現就辦法實例化
class Disk(All_file):
    def read(self):
        print("disk read")

    def write(self):
        print("disk write")


class Mem(All_file):
    def read(self):
        print("mem read")

    def write(self):
        print("mem write")

class cdrom(All_file):
    def read(self):
        print("cd read")

    def write(self):
        print("burn cd")


cd1 = cdrom() # 如果 cdrom沒有去實現write方法,實例化時就會報錯


‘‘‘


參考: http://www.cnblogs.com/linhaifeng/articles/7340153.html

抽象類與接口

抽象類的本質還是類,指的是一組類的相似性,包括數據屬性(如all_type)和函數屬性(如read、write),而接口只強調函數屬性的相似性。

抽象類是一個介於類和接口直接的一個概念,同時具備類和接口的部分特性,可以用來實現歸一化設計 
‘‘‘
技術分享圖片

python面向對象之靜態屬性/靜態方法/類方法/組合