真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python學(xué)習(xí)31(面向?qū)ο螅?/h1>

類的兩種類型:
經(jīng)典類:
class Person():#沒有繼承object
Pass

創(chuàng)新互聯(lián)主營橋西網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件定制開發(fā),橋西h5微信小程序開發(fā)搭建,橋西網(wǎng)站營銷推廣歡迎橋西等地區(qū)企業(yè)咨詢

新式類:
class Person(object):#繼承object
pass

面向?qū)ο蠹夹g(shù)簡介
類(Class):用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個(gè)對象所共有的屬性和方法。對象是類的實(shí)例。
類變量:類變量在整個(gè)實(shí)例化的對象中是公用的。類變量定義在類中且在函數(shù)體之外。類變量通常不作為實(shí)例變量使用。
數(shù)據(jù)成員:類變量或者實(shí)例變量用于處理類及其實(shí)例對象的相關(guān)的數(shù)據(jù)。
方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進(jìn)行改寫,這個(gè)過程叫方法的覆蓋(override),也稱為方法的重寫。
實(shí)例變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類。
繼承:即一個(gè)派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許
把一個(gè)派生類的對象作為一個(gè)基類對象對待。例如,有這樣一個(gè)設(shè)計(jì):一個(gè)Dog類型的對象派生自Animal類,這是模擬"是一個(gè)(is-a)"關(guān)系(例圖,Dog是一個(gè)Animal)。
實(shí)例化:創(chuàng)建一個(gè)類的實(shí)例,類的具體對象。
方法:類中定義的函數(shù)。
對象:通過類定義的數(shù)據(jù)結(jié)構(gòu)實(shí)例。對象包括兩個(gè)數(shù)據(jù)成員(類變量和實(shí)例變量)和方法

創(chuàng)建類
#coding=utf-8
class Employee(object):
empCount = 0

def __init__(self,name,salary):
    self.name = name
    self.salary = salary
    Employee.empCount += 1

def displayCount(self):
    print("total employee",Employee.empCount)

def displayEmployee(self):
    print("name:",self.name,",salary:",self.salary)

empCount變量是一個(gè)類變量(也叫靜態(tài)變量),它的值將在這個(gè)類的所有實(shí)例之間共享。你可以在內(nèi)部類或外部類使用Employee.empCount訪問。類中第一個(gè)方法init()是一種特殊方法,被稱做類的構(gòu)造函數(shù)或初始化方法,只要創(chuàng)建類的實(shí)例,就會調(diào)用這個(gè)方法。如果沒顯示定義這個(gè)方法,默認(rèn)會給一個(gè)空的構(gòu)造方法。類方法中參數(shù)中的self,代表實(shí)例本身,相當(dāng)于java中的this指針。并且類中所有的方法中都必須有self,并且寫在第一個(gè)參數(shù)位置。所有類都是繼承至基類object。

類和對象在內(nèi)存中的保存
類以及類中的方法在內(nèi)存中只有一份,而根據(jù)類創(chuàng)建的每一個(gè)對象都在內(nèi)存中需要存一份

如上圖所示,根據(jù)類創(chuàng)建對象時(shí),對象中除了封裝 name 和 age 的值之外,還會保存一個(gè)類對象指針,該值指向當(dāng)前對象的類。當(dāng)通過 obj1 執(zhí)行 【方法一】 時(shí),過程如下:根據(jù)當(dāng)前對象中的 類對象指針 找到類中的方法將對象 obj1 當(dāng)作參數(shù)傳給 方法的第一個(gè)參數(shù) self

面向?qū)ο髴?yīng)用場景
函數(shù)式的應(yīng)用場景 --> 各個(gè)函數(shù)之間是獨(dú)立且無共用的數(shù)據(jù)
面向?qū)ο缶幊痰膽?yīng)用場景→各個(gè)函數(shù)公用一組數(shù)據(jù)

封裝1
封裝,顧名思義就是將內(nèi)容封裝到某個(gè)地方,以后再去調(diào)用被封裝在某處的內(nèi)容。

在使用面向?qū)ο蟮姆庋b特性時(shí),需要:
將內(nèi)容封裝到某處
從某處調(diào)用被封裝的內(nèi)容

self 是一個(gè)形式參數(shù),當(dāng)執(zhí)行 obj1 = Foo('wupeiqi', 18 ) 時(shí),self 等于 obj1
當(dāng)執(zhí)行 obj2 = Foo('alex', 78 ) 時(shí),self 等于 obj2;
所以,內(nèi)容其實(shí)被封裝到了對象 obj1 和 obj2 中,每個(gè)對象中都有 name 和 age屬性,在內(nèi)存里類似于下圖來保存:

調(diào)用封裝的內(nèi)容
調(diào)用被封裝的內(nèi)容時(shí),有兩種情況:
通過對象直接調(diào)用
通過 self 間接調(diào)用
1、通過對象直接調(diào)用被封裝的內(nèi)容
上圖展示了對象 obj1 和 obj2 在內(nèi)存中保存的方式,根據(jù)保存格式可以如此調(diào)用被封裝的內(nèi)容:對象.屬性名
2、通過self間接調(diào)用被封裝的內(nèi)容執(zhí)行類中的方法時(shí),需要通過self間接調(diào)用被封裝的內(nèi)容

通過對象直接調(diào)用
#coding=utf-8
class Foo:
def init(self,name,age):
self.name = name
self.age = age

obj1 = Foo("huhongiang",20)
print(obj1.name)# 直接調(diào)用obj1對象的name屬性
print(obj1.age)# 直接調(diào)用obj1對象的age屬性

obj2 = Foo("alex",73)
print(obj2.name)
print(obj2.age)

通過self間接調(diào)用被封裝的內(nèi)容
#coding=utf-8
class Foo:
def init(self,name,age):
self.name = name
self.age = age

def detail(self):
     print(self.name)
     print(self.age)

obj1 = Foo("huhongiang",20)
obj1.detail()
#python將obj1參數(shù)傳遞給self參數(shù),即obj1.detail(obj1),此時(shí)方法內(nèi)部self == obj1,所以self.name == obj1.name, self.name 就是huhongiang,self.age就是20

obj2 = Foo("alex",73)
obj2.detail()

類成員

字段
字段包括:普通字段和靜態(tài)字段,他們在定義和使用中有所區(qū)別,而最本質(zhì)的區(qū)別是內(nèi)存中保存的位置不同

普通字段屬于對象
靜態(tài)字段屬于類

#coding=utf-8
class Province:
#靜態(tài)字段,類變量
country = "中國"

def init(self,name):
#普通字段
self.name = name

obj = Province("河北省")
print(obj.name)#直接訪問普通字段

print(Province.country)#直接訪問靜態(tài)字段

靜態(tài)字段在內(nèi)存中只保存一份

普通字段在每個(gè)對象中都要保存一份

類變量可以被類和實(shí)例對象訪問,但是實(shí)例變量只能被實(shí)例對象訪問

方法
方法包括:普通方法、靜態(tài)方法和類方法,三種方法在內(nèi)存中都?xì)w屬于類,區(qū)別在于調(diào)用方式不同。
普通方法:由對象調(diào)用;至少一個(gè)self參數(shù);執(zhí)行普通方法時(shí),自動將調(diào)用該方法的對象賦值給self;
類方法:由類調(diào)用; 至少一個(gè)cls參數(shù);執(zhí)行類方法時(shí),自動將調(diào)用該方法的類復(fù)制給cls;
靜態(tài)方法:由類調(diào)用;無默認(rèn)參數(shù)

示例:

#coding=utf-8
class Foo(object):
def init(self,name):
self.name = name
#普通方法,需要默認(rèn)的self參數(shù)
def ord_func(self):
print(self.name)
print("普通方法")

#類方法,需要默認(rèn)cls參數(shù),cls代表類本身
@classmethod
def class_func(cls):
    print("類方法")

#靜態(tài)方法,不需要默認(rèn)參數(shù)
@staticmethod
def static_func():
    print("靜態(tài)方法")
    #return  self.name#靜態(tài)方法不能訪問實(shí)例變量,靜態(tài)方法可以訪問類變量(靜態(tài)變量)

f = Foo("gloryroad")
f.ord_func()#對象調(diào)用普通方法,不能用類調(diào)用

Foo.class_func()#直接用類名調(diào)用類方法
Foo.static_func()#直接用類名調(diào)用靜態(tài)方法

#靜態(tài)方法和類方法也可以由對象調(diào)用
f.class_func()
f.static_func()

Foo.ord_func() #但是不能由類直接調(diào)用普通方法(實(shí)例方法)
Foo.name #類也不能訪問實(shí)例變量

相同點(diǎn):對于所有的方法而言,均屬于類(非對象)中,所以,在內(nèi)存中也只保存一份。
不同點(diǎn):方法調(diào)用者不同、調(diào)用方法時(shí)自動傳入的參數(shù)不同

類的屬性
Python中的屬性其實(shí)是普通方法的變種。

@property
定義時(shí),在普通方法的基礎(chǔ)上添加 @property 裝飾器;定義時(shí),屬性僅有一個(gè)self參數(shù);
調(diào)用時(shí),無需括號

方法調(diào)用:foo_obj.func()
屬性調(diào)用:foo_obj.prop
注意:屬性存在意義是:訪問屬性時(shí)可以制造出和訪問字段完全相同的假象,屬性由方法變種而來,如果Python中沒有屬性,方法完全可以代替其功能。

#coding=utf-8
class Foo(object):

def func(self):
    print("func")

#定義屬性
@property
def prop(self):
    return "gloryroad"

foo_obj = Foo()
foo_obj.func()
print(foo_obj.prop)#調(diào)用屬性不需要括號

@method_name.setter @method_name.deleter
定義時(shí)在普通方法的基礎(chǔ)上添加@method_name.setter裝飾器,賦值操作時(shí)候自動執(zhí)行被修飾的方法;添加@method_name.deleter裝飾器,del 刪除

#coding=utf-8
class Goods(object):

@property
def price(self):
    print("@property")
    return "hhq"

@price.setter
def price(self,value):
    print("@price.setter")
    print(value)

@price.deleter
def price(self):
    print("@price.deleter")

obj = Goods()print(obj.price)#自動執(zhí)行@property修飾的方法,并獲得返回值
br/>print(obj.price)#自動執(zhí)行@property修飾的方法,并獲得返回值
del obj.price#自動執(zhí)行@price_deleter修飾的方法

新式類中的屬性有三種訪問方式,并分別對應(yīng)了三個(gè)被@property、@方法名.setter、@方法名.deleter修飾的方法


分享名稱:python學(xué)習(xí)31(面向?qū)ο螅?
文章來源:http://weahome.cn/article/ihjhpg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部