1. 程式人生 > >Python面向對象之結構與成員

Python面向對象之結構與成員

bim 使用 person %s 成員 分析 true main sel

1.面向對象結構分析:
----面相對象整體大致分為兩塊區域:
--------第一部分:靜態字段(靜態變量)部分
--------第二部分:方法部分
--每個大區域可以分為多個小部分:
class A:
    cooname = ‘Jake‘  # 靜態變量(靜態字段)
    __cooage = 20  # 私有靜態變量(私有靜態字段)

    def __init__(self, name, age):  # 普通方法(構造方法)
        self.name = name  # 對象屬性(普通字段)
        self.__age = age  # 私有對象屬性(私有普通字段)

    def func1(self):  # 普通方法
        pass

    def __func(self):  # 私有方法
        pass

    @property
    def prop(self):  # 屬性
        pass

    @classmethod  # 類方法
    def class_func(cls):
        ‘‘‘定義類方法,至少有一個cls參數‘‘‘
        pass

    @staticmethod  # 靜態方法
    def stact_func():
        ‘‘‘定義靜態方法,無默認參數‘‘‘
        pass

2.面向對象的私有與公有
對於每一個類的成員而言都有兩種形式:
----共有成員,在任何地方都可以訪問
----私有成員,只有在類的內部才能訪問

--------私有成員和共有成員的訪問限制不同:


靜態字段(靜態變量)
--共有靜態字段:類可以訪問,類內部可以訪問,派生類中可以訪問
--私有靜態字段:僅類內部可以訪問
普通字段(對象屬性)
--共有普通字段:對象可以訪問,類內部可以訪問,派生類中可以訪問
--私有普通字段:僅類內部可以訪問
方法:
--共有方法:對象可以訪問,類內部可以訪問,派生類中可以訪問
--私有方法:僅類內部可以訪問

總結:
對於這些私有成員來說,他們只能在類的內部使用,不能在類的外部以及派生類中使用.
ps:非要訪問私有成員的話,可以通過 對象._類__屬性名,但是絕對不允許!!!
為什麽可以通過._類__私有成員名訪問呢?因為類在創建時,
如果遇到了私有成員(包括私有靜態字段,私有普通字段,私有方法)
它會將其保存在內存時自動在前面加上_類名.

3.面向對象的成員
1)字段
字段包括:普通字段和靜態字段,他們在定義和使用中有所區別,
而最本質的區別是內存中保存的位置不同,
--普通字段屬於對象
--靜態字段屬於類
 
技術分享圖片
由上圖:

靜態字段在內存中只保存一份
普通字段在每個對象中都要保存一份
應用場景: 通過類創建對象時,如果每個對象都具有相同的字段,那麽就使用靜態字段
2)方法
方法包括:普通方法、靜態方法和類方法,三種方法在內存中都歸屬於類,區別在於調用方式不同。
--普通方法:由對象調用;至少一個self參數;執行普通方法時,自動將調用該方法的對象賦值給self;
--類方法:由類調用; 至少一個cls參數;執行類方法時,自動將調用該方法的類復制給cls;
--靜態方法:由類調用;無默認參數;
 
技術分享圖片
如上圖:
相同點:對於所有的方法而言,均屬於類(非對象)中,所以,在內存中也只保存一份。
不同點:方法調用者不同、調用方法時自動傳入的參數不同。

4.property classmethod staticmethod

1)property #將一個方法,偽裝成屬性
class Bmi(object):
    def __init__(self, name, weight, highe):
        self.name = name
        self.weight = weight
        self.height = highe

    @property
    def func(self):
        BMI = self.weight / (self.height ** 2)
        return BMI


person = Bmi(‘Tom‘, 80, 1.73)
s = person.name
ss = person.func #將方法偽裝成屬性
print(‘%s的BIM指數為%s‘ % (s, ss))

--------------------------------------------------
class Person():
    def __init__(self, name, age):
        self.name = name
        self.__age = age if type(age) is int else print(‘重新輸入‘)

    @property     #執行查詢操作自動執行此操作
    def age(self):
        return self.__age

    @age.setter     #執行更改操作執行此操作
    def age(self, temp):
        self.__age = temp if type(temp) is int else print(‘重新輸入‘)

    @age.deleter    #執行del操作自動執行此方法
    def age(self):
        del self.__age


2)classmethod
----類方法:通過類名調用方法,類方法中第一個參數約定俗稱cls,python自動將類名傳給cls
class A:
    def func(self):  # 普通方法
        print(self)

    @classmethod
    def func0(cls):  # 類方法
        print(cls)


a = A()
a.func()  # <__main__.A object at 0x105d8a438>
A.func0()  # <class ‘__main__.A‘>
a1 = A()
a1.func0()  # 對象調用類方法,cls 得到的是類本身.

****¥類方法應用場景
1-類中一些方法不需要對象參與
2-對類中靜態變量進行改變
3-繼承中,父類得到子類的類空間
例子:
class A:
    age = 10

    @classmethod
    def func(cls):
        print(cls.age)


class B(A):
    age = 20


B.func()  # 20

3)staticmethod
由類名調用,無默認參數,主要作用是:能夠使代碼清晰,復用性強!

Python面向對象之結構與成員