欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于python3 類(lèi)的屬性、方法、封裝、繼承實(shí)例講解

 更新時(shí)間:2017年09月19日 08:59:58   作者:大黑馬  
下面小編就為大家?guī)?lái)一篇基于python3 類(lèi)的屬性、方法、封裝、繼承實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

Python 類(lèi)

Python中的類(lèi)提供了面向?qū)ο缶幊痰乃谢竟δ埽侯?lèi)的繼承機(jī)制允許多個(gè)基類(lèi),派生類(lèi)可以覆蓋基類(lèi)中的任何方法,方法中可以調(diào)用基類(lèi)中的同名方法。

對(duì)象可以包含任意數(shù)量和類(lèi)型的數(shù)據(jù)。

python類(lèi)與c++類(lèi)相似,提供了類(lèi)的封裝,繼承、多繼承,構(gòu)造函數(shù)、析構(gòu)函數(shù)。

在python3中,所有類(lèi)最頂層父類(lèi)都是object類(lèi),與java類(lèi)似,如果定義類(lèi)的時(shí)候沒(méi)有寫(xiě)出父類(lèi),則object類(lèi)就是其直接父類(lèi)。

類(lèi)定義

類(lèi)定義語(yǔ)法格式如下:

class ClassName:
<statement-1>
.
.
.
<statement-N>

類(lèi)對(duì)象:創(chuàng)建一個(gè)類(lèi)之后,可以通過(guò)類(lèi)名訪(fǎng)問(wèn)、改變其屬性、方法

實(shí)例對(duì)象:類(lèi)實(shí)例化后,可以使用其屬性,可以動(dòng)態(tài)的為實(shí)例對(duì)象添加屬性(類(lèi)似javascript)而不影響類(lèi)對(duì)象。

類(lèi)的屬性

可以使用點(diǎn)(.)來(lái)訪(fǎng)問(wèn)對(duì)象的屬性

也可以使用以下函數(shù)的方式來(lái)訪(fǎng)問(wèn)屬性:

getattr(obj, name[, default]) : 訪(fǎng)問(wèn)對(duì)象的屬性

hasattr(obj,name) : 檢查是否存在一個(gè)屬性

setattr(obj,name,value) : 設(shè)置一個(gè)屬性。如果屬性不存在,會(huì)創(chuàng)建一個(gè)新屬性

delattr(obj, name) : 刪除屬性

Python內(nèi)置類(lèi)屬性

__dict__ : 類(lèi)的屬性(包含一個(gè)字典,由類(lèi)的數(shù)據(jù)屬性組成)

__doc__ :類(lèi)的文檔字符串

__name__: 類(lèi)名

__module__: 類(lèi)定義所在的模塊(類(lèi)的全名是'__main__.className',如果類(lèi)位于一個(gè)導(dǎo)入模塊mymod中,那么className.__module__ 等于 mymod)

__bases__ : 類(lèi)的所有父類(lèi)構(gòu)成元素(包含了以個(gè)由所有父類(lèi)組成的元組)

class Person:
  "Person類(lèi)"
  def __init__(self, name, age, gender):
    print('進(jìn)入Person的初始化')
    self.name = name
    self.age = age
    self.gender = gender
    print('離開(kāi)Person的初始化')
  def getName(self):
    print(self.name)
p = Person('ice', 18, '男')
print(p.name) # ice
print(p.age) # 18
print(p.gender) # 男
print(hasattr(p, 'weight')) # False
# 為p添加weight屬性
p.weight = '70kg'
print(hasattr(p, 'weight')) # True
print(getattr(p, 'name')) # ice
print(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'}
print(Person.__name__) # Person
print(Person.__doc__) # Person類(lèi)
print(Person.__dict__) # {'__doc__': 'Person類(lèi)', '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__init__': <function Person.__init__ at 0x000000000284E950>, 'getName': <function Person.getName at 0x000000000284EA60>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__module__': '__main__'}
print(Person.__mro__) # (<class '__main__.Person'>, <class 'object'>)
print(Person.__bases__) # (<class 'object'>,)
print(Person.__module__) # __main__

類(lèi)的方法

在類(lèi)地內(nèi)部,使用def關(guān)鍵字可以為類(lèi)定義一個(gè)方法,與一般函數(shù)定義不同,類(lèi)方法必須包含參數(shù)self,且為第一個(gè)參數(shù)。

類(lèi)的專(zhuān)有方法:

__init__ 構(gòu)造函數(shù),在生成對(duì)象時(shí)調(diào)用

__del__ 析構(gòu)函數(shù),釋放對(duì)象時(shí)使用

__repr__ 打印,轉(zhuǎn)換

__setitem__按照索引賦值

__getitem__按照索引獲取值

__len__獲得長(zhǎng)度

__cmp__比較運(yùn)算

__call__函數(shù)調(diào)用

__add__加運(yùn)算

__sub__減運(yùn)算

__mul__乘運(yùn)算

__div__除運(yùn)算

__mod__求余運(yùn)算

__pow__稱(chēng)方

__init__()方法是一種特殊的方法,被稱(chēng)為類(lèi)的構(gòu)造函數(shù)或初始化方法,當(dāng)創(chuàng)建了這個(gè)類(lèi)的實(shí)例時(shí)就會(huì)調(diào)用該方法,與c++中構(gòu)造函數(shù)類(lèi)似。只需在自定義的類(lèi)中重寫(xiě)__init__()方法即可。

class Person:
  def __init__(self, name, age, gender):
    print('進(jìn)入Person的初始化')
    self.name = name
    self.age = age
    self.gender = gender
    print('離開(kāi)Person的初始化')
  def getName(self):
    print(self.name)
# Person實(shí)例對(duì)象
p = Person('ice', 18, '男')
print(p.name)
print(p.age)
print(p.gender)
p.getName()
# 進(jìn)入Person的初始化
# 離開(kāi)Person的初始化
# ice
# 18
# 男
# ice

析構(gòu)函數(shù) __del__ ,__del__在對(duì)象消逝的時(shí)候被調(diào)用,當(dāng)對(duì)象不再被使用時(shí),__del__方法運(yùn)行:

方法

實(shí)例方法:只能通過(guò)實(shí)例調(diào)用,實(shí)例方法第一個(gè)定義的參數(shù)只能是實(shí)例本身引用

class Myclass:
  def foo(self):
    print(id(self),'foo')

a=Myclass()#既然是實(shí)例對(duì)象,那就要?jiǎng)?chuàng)建實(shí)例
a.foo()#輸出類(lèi)里的函數(shù)地址
print(id(a))#輸出類(lèi)對(duì)象的地址

#結(jié)果地址一樣

類(lèi)方法:定義類(lèi)方法,要使用裝飾器@classmethod,定義的第一個(gè)參數(shù)是能是類(lèi)對(duì)象的引用,可以通過(guò)類(lèi)或者實(shí)例直用

class Myclass:
@classmethod#類(lèi)裝飾器
  def foo2(cls):
    print(id(cls),'foo2')
  #類(lèi)對(duì)象,直接可以調(diào)用,不需要實(shí)例化
print(id(Myclass),'yy')
Myclass.foo2()#直接可以調(diào)用

靜態(tài)方法:定義靜態(tài)方法使用裝飾器@staticmethod,沒(méi)有默認(rèn)的必須參數(shù),通過(guò)類(lèi)和實(shí)例直接調(diào)用

class Myclass:
@staticmethod#靜態(tài)方法
  def foo3():
    print('foo3')

Myclass.foo3()#沒(méi)有參數(shù)
a.foo3()
#結(jié)果foo3

類(lèi)的封裝

python通過(guò)變量名命名來(lái)區(qū)分屬性和方法的訪(fǎng)問(wèn)權(quán)限,默認(rèn)權(quán)限相當(dāng)于c++和java中的public

類(lèi)的私有屬性: __private_attrs:兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該屬性為私有,不能在類(lèi)地外部被使用或直接訪(fǎng)問(wèn)。在類(lèi)內(nèi)部的方法中使用時(shí)self.__private_attrs。

類(lèi)的私有方法:__private_method:兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該方法為私有方法,不能在類(lèi)地外部調(diào)用。在類(lèi)的內(nèi)部調(diào)用 self.__private_methods

雖然python不允許實(shí)例化的類(lèi)訪(fǎng)問(wèn)私有數(shù)據(jù),但可以使用 object._className__attrName 訪(fǎng)問(wèn)屬性。其實(shí)python內(nèi)部私有化的實(shí)現(xiàn)只是將attrName屬性變?yōu)榱薩className__attrName而已

class Demo:
  __id = 123456
  def getId(self):
    return self.__id
temp = Demo()
# print(temp.__id) # 報(bào)錯(cuò) AttributeError: 'Demo' object has no attribute '__id'
print(temp.getId()) # 123456
print(temp._Demo__id) # 123456

類(lèi)的繼承

面向?qū)ο蟮木幊處?lái)的主要好處之一是代碼的重用,實(shí)現(xiàn)這種重用的方法之一是通過(guò)繼承機(jī)制。繼承完全可以理解成類(lèi)之間的類(lèi)型和子類(lèi)型關(guān)系。

需要注意的地方:繼承語(yǔ)法 class 派生類(lèi)名(基類(lèi)名)://... 基類(lèi)名寫(xiě)作括號(hào)里,基本類(lèi)是在類(lèi)定義的時(shí)候,在元組之中指明的。

在python中繼承中的一些特點(diǎn):

1:在繼承中基類(lèi)的構(gòu)造(__init__()方法)不會(huì)被自動(dòng)調(diào)用,它需要在其派生類(lèi)的構(gòu)造中親自專(zhuān)門(mén)調(diào)用。使用super().__init__()或parentClassName.__init__()

2:在調(diào)用基類(lèi)的方法時(shí),需要加上基類(lèi)的類(lèi)名前綴,且需要帶上self參數(shù)變量。區(qū)別于在類(lèi)中調(diào)用普通函數(shù)時(shí)并不需要帶上self參數(shù)

3:Python總是首先查找對(duì)應(yīng)類(lèi)型的方法,如果它不能在派生類(lèi)中找到對(duì)應(yīng)的方法,它才開(kāi)始到基類(lèi)中逐個(gè)查找。(先在本類(lèi)中查找調(diào)用的方法,找不到才去基類(lèi)中找)。

如果在繼承元組中列了一個(gè)以上的類(lèi),那么它就被稱(chēng)作"多重繼承" 。

語(yǔ)法:

派生類(lèi)的聲明,與他們的父類(lèi)類(lèi)似,繼承的基類(lèi)列表跟在類(lèi)名之后。

多態(tài)

如果父類(lèi)方法的功能不能滿(mǎn)足需求,可以在子類(lèi)重寫(xiě)父類(lèi)的方法。實(shí)例對(duì)象調(diào)用方法時(shí)會(huì)調(diào)用其對(duì)應(yīng)子類(lèi)的重寫(xiě)后的方法

python3.3 類(lèi)與繼承 小例

hon中的類(lèi)提供了面向?qū)ο缶幊痰乃谢竟δ埽侯?lèi)的繼承機(jī)制允許多個(gè)基類(lèi),派生類(lèi)可以覆蓋基類(lèi)中的任何方法,方法中可以調(diào)用基類(lèi)中的同名方法。

class Base:
  def __init__(self):
    self.data=[]
  def add(self,x):
    self.data.append(x)
  def addtwice(self,x):
    self.add(x)
    self.add(x)

# child extends base
class Child(Base):
  def plus(self,a,b):
    return a+b

oChild=Child()
oChild.add("str1")
oChild.add(999)
oChild.addtwice(4)
print(oChild.data)
print(oChild.plus(2,3))

對(duì)象可以包含任意數(shù)量和類(lèi)型的數(shù)據(jù)。

python類(lèi)與c++類(lèi)相似,提供了類(lèi)的封裝,繼承、多繼承,構(gòu)造函數(shù)、析構(gòu)函數(shù)。

在python3中,所有類(lèi)最頂層父類(lèi)都是object類(lèi),與java類(lèi)似,如果定義類(lèi)的時(shí)候沒(méi)有寫(xiě)出父類(lèi),則object類(lèi)就是其直接父類(lèi)。

類(lèi)定義

類(lèi)定義語(yǔ)法格式如下:

class ClassName:
<statement-1>
.
.
.
<statement-N>

類(lèi)對(duì)象:創(chuàng)建一個(gè)類(lèi)之后,可以通過(guò)類(lèi)名訪(fǎng)問(wèn)、改變其屬性、方法

實(shí)例對(duì)象:類(lèi)實(shí)例化后,可以使用其屬性,可以動(dòng)態(tài)的為實(shí)例對(duì)象添加屬性(類(lèi)似javascript)而不影響類(lèi)對(duì)象。

類(lèi)的屬性

可以使用點(diǎn)(.)來(lái)訪(fǎng)問(wèn)對(duì)象的屬性

也可以使用以下函數(shù)的方式來(lái)訪(fǎng)問(wèn)屬性:

getattr(obj, name[, default]) : 訪(fǎng)問(wèn)對(duì)象的屬性

hasattr(obj,name) : 檢查是否存在一個(gè)屬性
setattr(obj,name,value) : 設(shè)置一個(gè)屬性。如果屬性不存在,會(huì)創(chuàng)建一個(gè)新屬性

delattr(obj, name) : 刪除屬性

Python內(nèi)置類(lèi)屬性

__dict__ : 類(lèi)的屬性(包含一個(gè)字典,由類(lèi)的數(shù)據(jù)屬性組成)

__doc__ :類(lèi)的文檔字符串

__name__: 類(lèi)名

__module__: 類(lèi)定義所在的模塊(類(lèi)的全名是'__main__.className',如果類(lèi)位于一個(gè)導(dǎo)入模塊mymod中,那么className.__module__ 等于 mymod)

__bases__ : 類(lèi)的所有父類(lèi)構(gòu)成元素(包含了以個(gè)由所有父類(lèi)組成的元組)

class Person:
  "Person類(lèi)"
  def __init__(self, name, age, gender):
    print('進(jìn)入Person的初始化')
    self.name = name
    self.age = age
    self.gender = gender
    print('離開(kāi)Person的初始化')
  def getName(self):
    print(self.name)
p = Person('ice', 18, '男')
print(p.name) # ice
print(p.age) # 18
print(p.gender) # 男
print(hasattr(p, 'weight')) # False
# 為p添加weight屬性
p.weight = '70kg'
print(hasattr(p, 'weight')) # True
print(getattr(p, 'name')) # ice
print(p.__dict__) # {'age': 18, 'gender': '男', 'name': 'ice'}
print(Person.__name__) # Person
print(Person.__doc__) # Person類(lèi)
print(Person.__dict__) # {'__doc__': 'Person類(lèi)', '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__init__': <function Person.__init__ at 0x000000000284E950>, 'getName': <function Person.getName at 0x000000000284EA60>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__module__': '__main__'}
print(Person.__mro__) # (<class '__main__.Person'>, <class 'object'>)
print(Person.__bases__) # (<class 'object'>,)
print(Person.__module__) # __main__

類(lèi)的方法

在類(lèi)地內(nèi)部,使用def關(guān)鍵字可以為類(lèi)定義一個(gè)方法,與一般函數(shù)定義不同,類(lèi)方法必須包含參數(shù)self,且為第一個(gè)參數(shù)。

類(lèi)的專(zhuān)有方法:

__init__ 構(gòu)造函數(shù),在生成對(duì)象時(shí)調(diào)用

__del__ 析構(gòu)函數(shù),釋放對(duì)象時(shí)使用

__repr__ 打印,轉(zhuǎn)換

__setitem__按照索引賦值

__getitem__按照索引獲取值

__len__獲得長(zhǎng)度

__cmp__比較運(yùn)算

__call__函數(shù)調(diào)用

__add__加運(yùn)算

__sub__減運(yùn)算

__mul__乘運(yùn)算

__div__除運(yùn)算

__mod__求余運(yùn)算

__pow__稱(chēng)方

__init__()方法是一種特殊的方法,被稱(chēng)為類(lèi)的構(gòu)造函數(shù)或初始化方法,當(dāng)創(chuàng)建了這個(gè)類(lèi)的實(shí)例時(shí)就會(huì)調(diào)用該方法,與c++中構(gòu)造函數(shù)類(lèi)似。只需在自定義的類(lèi)中重寫(xiě)__init__()方法即可。

class Person:
  def __init__(self, name, age, gender):
    print('進(jìn)入Person的初始化')
    self.name = name
    self.age = age
    self.gender = gender
    print('離開(kāi)Person的初始化')
  def getName(self):
    print(self.name)
# Person實(shí)例對(duì)象
p = Person('ice', 18, '男')
print(p.name)
print(p.age)
print(p.gender)
p.getName()
# 進(jìn)入Person的初始化
# 離開(kāi)Person的初始化
# ice
# 18
# 男
# ice

析構(gòu)函數(shù) __del__ ,__del__在對(duì)象消逝的時(shí)候被調(diào)用,當(dāng)對(duì)象不再被使用時(shí),__del__方法運(yùn)行:

類(lèi)的封裝

python通過(guò)變量名命名來(lái)區(qū)分屬性和方法的訪(fǎng)問(wèn)權(quán)限,默認(rèn)權(quán)限相當(dāng)于c++和java中的public

類(lèi)的私有屬性: __private_attrs:兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該屬性為私有,不能在類(lèi)地外部被使用或直接訪(fǎng)問(wèn)。在類(lèi)內(nèi)部的方法中使用時(shí)self.__private_attrs。

類(lèi)的私有方法:__private_method:兩個(gè)下劃線(xiàn)開(kāi)頭,聲明該方法為私有方法,不能在類(lèi)地外部調(diào)用。在類(lèi)的內(nèi)部調(diào)用 self.__private_methods

雖然python不允許實(shí)例化的類(lèi)訪(fǎng)問(wèn)私有數(shù)據(jù),但可以使用 object._className__attrName 訪(fǎng)問(wèn)屬性。其實(shí)python內(nèi)部私有化的實(shí)現(xiàn)只是將attrName屬性變?yōu)榱薩className__attrName而已

class Demo:
  __id = 123456
  def getId(self):
    return self.__id
temp = Demo()
# print(temp.__id) # 報(bào)錯(cuò) AttributeError: 'Demo' object has no attribute '__id'
print(temp.getId()) # 123456
print(temp._Demo__id) # 123456

類(lèi)的繼承

面向?qū)ο蟮木幊處?lái)的主要好處之一是代碼的重用,實(shí)現(xiàn)這種重用的方法之一是通過(guò)繼承機(jī)制。繼承完全可以理解成類(lèi)之間的類(lèi)型和子類(lèi)型關(guān)系。

需要注意的地方:繼承語(yǔ)法 class 派生類(lèi)名(基類(lèi)名)://... 基類(lèi)名寫(xiě)作括號(hào)里,基本類(lèi)是在類(lèi)定義的時(shí)候,在元組之中指明的。

在python中繼承中的一些特點(diǎn):

1:在繼承中基類(lèi)的構(gòu)造(__init__()方法)不會(huì)被自動(dòng)調(diào)用,它需要在其派生類(lèi)的構(gòu)造中親自專(zhuān)門(mén)調(diào)用。使用super().__init__()或parentClassName.__init__()

2:在調(diào)用基類(lèi)的方法時(shí),需要加上基類(lèi)的類(lèi)名前綴,且需要帶上self參數(shù)變量。區(qū)別于在類(lèi)中調(diào)用普通函數(shù)時(shí)并不需要帶上self參數(shù)

3:Python總是首先查找對(duì)應(yīng)類(lèi)型的方法,如果它不能在派生類(lèi)中找到對(duì)應(yīng)的方法,它才開(kāi)始到基類(lèi)中逐個(gè)查找。(先在本類(lèi)中查找調(diào)用的方法,找不到才去基類(lèi)中找)。

如果在繼承元組中列了一個(gè)以上的類(lèi),那么它就被稱(chēng)作"多重繼承" 。

語(yǔ)法:

派生類(lèi)的聲明,與他們的父類(lèi)類(lèi)似,繼承的基類(lèi)列表跟在類(lèi)名之后。

多態(tài)

如果父類(lèi)方法的功能不能滿(mǎn)足需求,可以在子類(lèi)重寫(xiě)父類(lèi)的方法。實(shí)例對(duì)象調(diào)用方法時(shí)會(huì)調(diào)用其對(duì)應(yīng)子類(lèi)的重寫(xiě)后的方法

python3.3 類(lèi)與繼承 小例

class Base:
def __init__(self):
self.data=[]
def add(self,x):
self.data.append(x)
def addtwice(self,x):
self.add(x)
self.add(x)

# child extends base
class Child(Base):
def plus(self,a,b):
return a+b

oChild=Child()
oChild.add("str1")
oChild.add(999)
oChild.addtwice(4)
print(oChild.data)
print(oChild.plus(2,3))

以上這篇基于python3 類(lèi)的屬性、方法、封裝、繼承實(shí)例講解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論