Python 類>>>類屬性(私有屬性、公有屬性、實例屬性、局部變量)類方法(實例方法、靜態方法)


一、創建類:

 類是對某個對象的定義,它包含有關對象動作方式的信息,包括它的名稱、方法、屬性和事件。類不存在於內存中,因此它本身並不是對象。當程序運行需要引用類的代碼時,就會在內存中創建一個類的新實例,即對象。雖然只有一個類,但能以這個類在內存中創建多個相同類型的對象

class Person(object):

    #類的方法中必須要有一個self參數,但是方法被調用時,不用傳遞這個參數
    def get_name(self):      
        print "my name is: james"

    def get_age(self):
        print "my age is : 3、5"

    def get_hoppy(self):
        print "My hoppy is :lvyou"
boy = Person()
boy.get_name()       #但是方法被調用時,不用傳遞這個參數
boy.get_age()        #在調用get_age等方法時,boy自動將自己作為一個參數傳入方法中,因此我們稱它為self
boy.get_hoppy()

二、類的封裝與多態

封裝:即將抽象得到的數據和行為(功能)相結合,形成一個有機整體,也就是將數據和操作數據的源代碼進行有機整合,形成類。

其中數據和函數都是類的成員。目的是隱藏對象的屬性和實現細節,對外公開接口,在程序中控制屬性的讀和修改的訪問級別。

封裝和多態的區別:多態可以讓用戶對不知道是什么類的對象進行方法調用,而封裝則不用關心對象是如何創建的而直接進行使用

class MyClass(object):

    # 定義一個全局變量
    name = 'html'

    def set_name(self, name):
        self.name = name

    def get_name(self):
        return self.name

my = MyClass()
my.set_name('kryle')
print my.get_name()

# 如果將變量存儲到全局變量name中時,實例化MyClass之后,全局變量name將會改變
my = MyClass()
my.name = 'Tom'
print my.get_name()

# 對象有自己的狀態,對象的狀態由它的特性名稱來描述,eg:下面she對象的內容不影響my對象的內容
she = MyClass()
she.set_name('angel')
print she.get_name()
print my.get_name()

三、類方法、屬性分類與定義:

python類方法和屬性分類:

類中方法:公有方法、私有方法、類方法、靜態方法

類中屬性:私有屬性、公有屬性、實例屬性、局部變量

類中變量變量分為公有變量和私有變量

【python類包含方法】

公有方法:在類中和類外都能調用的方法

私有方法:不能被類外部調用,在方法前面加上“__“雙下划線就是私有方法

類方法:被classmethod()函數處理過的函數,能被類所調用,也能被對象所調用(是繼承的關系)

靜態方法:相當於“全局函數”,可以被類直接調用,可以被所有實例化對象共享,通過staticmethod()定義, 靜態方法沒有“self”參數。

內置函數:__xxx__ 系統定義名字,前后均有一個“雙下划線” 代表python里特殊方法專用的標識,如 __init__() 代表類的構造函數。

三種方法的主要區別在於參數,實例方法被綁定到一個實例,只能通過實例進行調用;但是對於靜態方法和類方法,可以通過類名和實例兩種方式進行調用

self參數 說明:
用於區分函數和類的方法(必須有一個self),self參數表示執行對象本身

【python類包含屬性】

  • 私有屬性

    函數、方法或者屬性的名稱以兩個下划線開始,則為私有類型;

  • 公有屬性

    如果函數、方法或者屬性的名稱沒有以兩個下划線開始,則為公有屬性;

  • 實例屬性

    以self作為前綴的屬性;

  • 局部變量

    類的方法中定義的變量沒有使用self作為前綴聲明,則該變量為局部變量;

詳細說明:

xxx 公有變量

_xxx "單下划線 " 開始的成員變量叫做保護變量,意思是只有類對象(即類實例)和子類對象自己能訪問到這些變量,需通過類提供的接口進行訪問;不能用'from module import *'導入

__xxx 類中的私有變量(Python的函數也是對象,所以成員方法稱為成員變量也行得通。)," 雙下划線 " 開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數據,但可以通過私有屬性,可以通過instance._classname_attribute方式訪問

tip:python中有點偽私有屬性的意思

四、區別

classmethod 是類方法,而 staticmethod 是靜態方法。

在 Python中,靜態方法和類方法都是可以通過類對象和類對象實例訪問。但是區別是:
@classmethod 是一個函數修飾符,它表示接下來的是一個類方法,類方法的第一個參數 cls,而實例方法的第一個參數是 self,表示該類的一個實例。

普通對象方法至少需要一個 self 參數,代表類對象實例,類方法有類變量 cls 傳入,從而可以用 cls 做一些相關的處理。並且有子類繼承時,調用該類方法時,傳入的類變量 cls 是子類,而非父類。

對於類方法,可以通過類來調用,比如說 A 是一個類,那么我們可以通過 A.method() 來調用 A 里面的 method 方法, 也可以通過類的一個實例來調用,如 A().method() 進行調用,首先 A() 方法會調用 A 的初始化方法進行實例化出一個 A 的對象,然后通過該對象調用 method 方法。

五、

六、實例

類方法區分:

# -*-coding:utf-8-*-

class People(object):
color = "yellow" #全局公有變量
default_name = 'anyone'
__age = 30 # 私有屬性

#python中內中構造函數
def __init__(self):
self.name ='someone'
#python中S實例函數
def think(self):
self.color = "black"
print("I am a %s" % self.color)
print(self.__age)

def __talk(self):
print("I am talking with Tom")

# def test(self):
# print self.color
@classmethod # 裝飾器,只對下面的一個函數起作用
def class_method(cls, message): # 類方法
print("執行類方法 class_method(%s,%s)" % (cls, message))
# print People.color #訪問類里面其它成員

@staticmethod # 裝飾器,只對下面的一個函數起作用
def static_method(): # 類靜態方法
print("我是被定義的靜態方法")


ren = People()
print(ren)
print(ren.color)
ren.think()
print(ren._People__age)
# 私有屬性調用方法,建議:僅程序測試使用
 
         
 

部分引用來自:https://blog.csdn.net/wohu1104/article/details/89424370(比較不錯)


免責聲明!

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



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