Python面向對象之結構與成員

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
由類名調用,無默認參數,主要做用是:可以使代碼清晰,複用性強!
相關文章
相關標籤/搜索