面向物件技術簡介
類(Class): 用來描述具有相同的屬性和方法的物件的集合,它定義了該集合中每個物件所共有的屬性和方法,物件是類的實體,
方法:類中定義的函式,
類變數:類變數在整個實體化的物件中是公用的,類變數定義在類中且在函式體之外,類變數通常不作為實體變數使用,
資料成員:類變數或者實體變數用于處理類及其實體物件的相關的資料,
方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個程序叫方法的覆寫(override),也稱為方法的重寫,
區域變數:定義在方法中的變數,只作用于當前實體的類,
實體變數:在類的宣告中,屬性是用變數來表示的,這種變數就稱為實體變數,實體變數就是一個用 self 修飾的變數,
繼承:即一個派生類(derived class)繼承基類(base class)的欄位和方法,繼承也允許把一個派生類的物件作為一個基類物件對待,例如,有這樣一個設計:一個Dog型別的物件派生自Animal類,這是模擬"是一個(is-a)"關系(例圖,Dog是一個Animal),
實體化:創建一個類的實體,類的具體物件,
物件:通過類定義的資料結構實體,物件包括兩個資料成員(類變數和實體變數)和方法,
類定義
class ClassName:
<statement-1>
.
.
.
<statement-N>
類變數和實體變數
通常來說,實體變數是對于每個實體都獨有的資料,而類變數是該類所有實體共享的屬性和方法,
class Dog:
kind = 'canine' # class variable
walk_place = []
def __init__(self, name):
self.name = name # instance variable
上面類Dog中,類屬性kind為所有實體所共享;實體屬性name為每個Dog的實體獨有,
類物件和實體物件
Python中一切皆物件;類定義完成后,會在當前作用域中定義一個以類名為名字,指向類物件的名字,實體物件是類物件實體化的產物,
class Dog:
kind = 'canine' # class variable
walk_place = []
def __init__(self, name):
self.name = name # instance variable
def walk(self, place):
self.walk_place.append(place)
dog = Dog('James')
dog.walk('shenzhen')
print(Dog.walk_place)
上面類Dog中,Dog屬于類物件,而實體化后的dog則是實體物件,
屬性系結
在定義類時,通常我們說的定義屬性,其實是分為兩個方面的:
a.類屬性系結
b.實體屬性系結
用系結這個詞更加確切;不管是類物件還是實體物件,屬性都是依托物件而存在的,
Python作為動態語言,類物件和實體物件都可以在運行時系結任意屬性,因此,類屬性的系結發生在兩個地方:
a.類定義時;
b.運行時任意階段,
類屬性系結,因為是動態語言,所以可以在運行時增加屬性,洗掉屬性,如下代碼:
class Dog:
kind = 'canine' # class variable
def __init__(self, name):
self.name = name # instance variable
Dog.color = 'yellow'
print(Dog.kind)
print(Dog.color)
del Dog.color
print(Dog.color) #error
Exception has occurred: AttributeError
type object 'Dog' has no attribute 'color'
File "D:\zPY\test\test_class.py", line 21, in <module>
print(Dog.color)
實體屬性系結,就是類實體化后再系結屬性,
因為__init__(構造方法)在實體化時執行,所以self.name = name也是屬于實體屬性系結,
如下代碼:
class Dog:
kind = 'canine' # class variable
def __init__(self, name):
self.name = name # instance variable
dog = Dog('James')
dog.color = 'yellow'
print(dog.name)
print(dog.color)
self
self代表類的實體,而非類,是當前物件的地址,
self 不是 python 關鍵字,我們把他換成其他字符也是可以正常執行的,
還有另外一個問題,定義屬性或者方法時,哪些需要加self哪些不需要呢?
私有方法,類方法,靜態方法
私有方法:以 __兩個下劃線開頭,宣告該方法為私有方法,只能在類的內部呼叫 (類內部別的方法可以呼叫他),不能在類地外部呼叫,
類方法:在類的內部,使用 def 關鍵字來定義一個方法,與一般函式定義不同,類方法必須包含引數 self, 且為第一個引數,self 代表的是類的實體,
靜態方法:需要通過修飾器@staticmethod來進行修飾,靜態方法不需要多定義引數
class People(object):
country = 'china'
#私有方法
def __private_meth(self):
print('this is a private method')
#類方法
def class_meth(self):
print('this is a class method')
#靜態方法,不用定義引數
@staticmethod
def getCountry():
return People.country
私有屬性與私有方法
# 私有屬性
__private_attrs # 不能在類的外部被使用,在內部可以正常呼叫self.__private_attrs
# 私有方法
__private_methods # 與私有屬性類似,不能在類的外部呼叫,但是內部正常使用self.__private_methods
雙下劃線、單下劃線、頭尾雙下劃線
__name__ # 特殊方法,一般是系統定義名字
__private # 私有型別,只有類物件可以訪問,不建議用此方法,__對Python有特殊意義
_protected # 保護型別,類物件和子類物件可以呼叫,建議用這種方式定義特別的屬性方法
lass Person5:
def __p(self):
print("這是私有屬性") #內部函式也同樣可以任意之間互相呼叫
def p1(self):
print("這是p1不是私有方法")
def p2(self):
print("這是p2,可以呼叫p1,也可以呼叫私有方法__p")
self.p1()
self.__p()
#創建物件
c1 = Person5()
c1.p1()
c1.p2()
#c1.__p() #不能直接私有函式,報錯,注意區分系統自帶的函式如__str__,外部可以直接呼叫的,
'''結果如下:
這是p1不是私有方法
這是p2,可以呼叫p1,也可以呼叫私有方法__p
這是p1不是私有方法
這是私有屬性
'''
繼承,多繼承
繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類
class ParentClass1: #定義父類
pass
class ParentClass2: #定義父類
pass
class SubClass1(ParentClass1): #單繼承,基類是ParentClass1,派生類是SubClass
pass
class SubClass2(ParentClass1,ParentClass2): #python支持多繼承,用逗號分隔開多個繼承的類
pass
class Animal:
'''
人和狗都是動物,所以創造一個Animal基類
'''
def __init__(self, name, aggressivity, life_value):
self.name = name # 人和狗都有自己的昵稱;
self.aggressivity = aggressivity # 人和狗都有自己的攻擊力;
self.life_value = https://www.cnblogs.com/brownricecake/archive/2020/11/20/life_value # 人和狗都有自己的生命值;
def eat(self):
print('%s is eating'%self.name)
class Dog(Animal):
pass
class Person(Animal):
pass
egg = Person('egon',10,1000)
ha2 = Dog('二愣子',50,1000)
egg.eat()
ha2.eat()
需要注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜索 即方法在子類中未找到時,從左到右查找父類中是否包含方法,
方法重寫
如果你的父類方法的功能不能滿足你的需求,你可以在子類重寫你父類的方法,實體如下:
#此示例示意覆寫的含義及方法
class A:
def work(self):
print('A.work被呼叫')
class B(A):
'''B類繼承子A類'''
def work(self):
print('B.work被呼叫')
b = B()
b.work() #B.work被呼叫
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/225544.html
標籤:其他
上一篇:網路編程之 UDP 實作聊天
