python 完全面向对象_python 面向对象(一)
面向?qū)ο笕Q Object Oriented Programming 簡(jiǎn)稱OOP,是一種編程思想。是把對(duì)象作為一個(gè)程序的基本單元,把數(shù)據(jù)和功能封裝在里面,能夠?qū)崿F(xiàn)很好的復(fù)用性,靈活性和擴(kuò)展性。
基本概念:
面向?qū)ο笫且环N抽象,有兩個(gè)基本概念:類和對(duì)象。
類是定義一件事物的抽象特點(diǎn),而對(duì)象是類的一個(gè)實(shí)例。
例子:例如程序員是一個(gè)類,而具體的一個(gè)人,比如我就是一個(gè)對(duì)象。
基本要素:
屬性和方法。以程序員為例。程序員具體下面屬性和功能:
屬性:年齡,性別和身高。
功能(方法):寫代碼,修電腦。
繼承:
面向?qū)ο蟮木幊處淼闹饕锰幹皇谴a的重用,實(shí)現(xiàn)這種重用的方法之一是通過繼承機(jī)制。繼承完全可以理解成類之間的類型和子類型關(guān)系。
多態(tài):
用一個(gè)類繼承幾個(gè)不同的類,調(diào)用同一方法的時(shí)候,會(huì)有不同的反應(yīng)。
實(shí)戰(zhàn)一、定義類:
class ClassName:
statement1
...
statement2
構(gòu)造函數(shù)
def init(self,[...):
析構(gòu)函數(shù),在銷毀一個(gè)對(duì)象時(shí)使用的,當(dāng)調(diào)用python垃圾回收的時(shí)候,才會(huì)調(diào)用。
def del(self,[..):
兩個(gè)內(nèi)建函數(shù):
dir()返回一個(gè)對(duì)象的屬性
type() 返回一個(gè)對(duì)象的類型
實(shí)戰(zhàn)二、定義類的屬性
1、直接在類里定義
類的對(duì)象會(huì)被所有類的對(duì)象所共享,所有類的屬性都一樣。
class Programer(object):
sex = 'male'
2、在構(gòu)造函數(shù)里定義
class Programer(object):
def __init__(self,name,age):
self.name = name
self.age = age
python的類沒有訪問權(quán)限的問題,也就是說所有的變量都是可訪問的。實(shí)際上python有私有的機(jī)制,就是在屬性前加__,但是這種私有機(jī)制實(shí)際上也是偽私有,因?yàn)樗鋵?shí)是用一個(gè)別名來保存這個(gè)屬性。例如在類A中的self.__a = 4, 實(shí)際上__a被修改成了_A__a保持在類中了。
3、常用屬性定義
class Programer(object):
def __init__(self,name,age,weight):
self.name = name # 可以公開訪問
self._age = age # 類的私有屬性,但仍然可以訪問
self.__weight = weight # 實(shí)現(xiàn)了部分私有屬性
class Programer(object):
hobby = 'Play Computer'
def __init__(self, name,age,weight):
self.name = name
self._age = age
self.__weight = weight
def get_weight(self):
return self.__weight
if __name__ == '__main__':
programer = Programer('Albert',25,80) # 將對(duì)象實(shí)例化
print(dir(programer)) # 打印所有屬性
print(programer.__dict__) # 從構(gòu)造函數(shù)里獲得的屬性
print(programer.get_weight()) # 獲取weiht 屬性的方法
print(programer._Programer__weight) #
print(programer.name)
運(yùn)行結(jié)果:
['_Programer__weight', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_age', 'get_weight', 'hobby', 'name']
{'_age': 25, '_Programer__weight': 80, 'name': 'Albert'}
80
80
Albert
實(shí)戰(zhàn)三、定義類的方法
函數(shù)和方法介紹:
函數(shù):是直接調(diào)用函數(shù)名調(diào)用的。
方法:必須是類的一部分,由別的程序來調(diào)用的。
@classmethod
調(diào)用的時(shí)候用類名,而不是某個(gè)對(duì)象。
@property
像訪問屬性一樣調(diào)用方法。
class Programer(object):
hobby = 'Play Computer'
def __init__(self, name,age,weight):
self.name = name
self._age = age
self.__weight = weight
@classmethod
def get_hobby(cls):
return cls.hobby
@property
def get_weight(self):
return self.__weight
def self_introduction(self):
print(('My Name is %s\nI am %s years old\n') % (self.name,self._age))
if __name__ == '__main__':
programer = Programer('Albert',25,80)
print(dir(programer))
print(Programer.get_hobby()) # 類方法調(diào)用的函數(shù)
print(programer.get_weight) # 已屬性的方式調(diào)用的函數(shù)
programer.self_introduction()
運(yùn)行結(jié)果:
['_Programer__weight', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_age', 'get_hobby', 'get_weight', 'hobby', 'name', 'self_introduction']
Play Computer
80
My Name is Albert
I am 25 years old
實(shí)戰(zhàn)四、類的繼承
繼承的子類:
1、會(huì)繼承父類的屬性和方法;
2、也可以自己定義,覆蓋父類的屬性和方法
用super()調(diào)用父類的方法:
class A(object):
def method(self,arg):
pass
class B(A):
def method(self,arg):
super(B,self).method(arg)
用類名調(diào)用父類的方法:
class A(object):
def method(self,arg):
pass
class B(A):
def method(self,arg):
A.method(arg)
子類的類型判斷:
isinstance # 判斷類型
issubclass # 判斷是否是子類
class Programer(object):
hobby = 'Play Computer'
def __init__(self, name,age,weight):
self.name = name
self._age = age
self.__weight = weight
@classmethod
def get_hobby(cls):
return cls.hobby
@property
def get_weight(self):
return self.__weight
def self_introduction(self):
print(('My Name is %s\nI am %s years old\n') % (self.name,self._age))
class BackendProgramer(Programer):
def __init__(self,name,age,weight,language):
super(BackendProgramer,self).__init__(name,age,weight)
self.language = language # 定義language這個(gè)屬性
if __name__ == '__main__':
programer = BackendProgramer('Albert',25,80,'Python')
print(dir(programer))
print(programer.__dict__)
print(type(programer))
print(isinstance(programer,Programer)) # 判斷是否是Programer這個(gè)類
運(yùn)行結(jié)果:
['_Programer__weight', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_age', 'get_hobby', 'get_weight', 'hobby', 'language', 'name', 'self_introduction']
{'_Programer__weight': 80, '_age': 25, 'language': 'Python', 'name': 'Albert'}
True
實(shí)戰(zhàn)五、類的多態(tài)
多態(tài)的要素:繼承和方法重寫
class Programer(object):
hobby = 'Play Computer'
def __init__(self, name,age,weight):
self.name = name
self._age = age
self.__weight = weight
@classmethod
def get_hobby(cls):
return cls.hobby
@property
def get_weight(self):
return self.__weight
def self_introduction(self):
print(('My Name is %s\nI am %s years old\n') % (self.name,self._age))
class BackendProgramer(Programer):
def __init__(self,name,age,weight,language):
super(BackendProgramer,self).__init__(name,age,weight)
self.language = language
# 重寫父類的 self_introduction方法
def self_introduction(self):
print(('My Name is %s\nMy favorite language is %s\n') % (self.name,self.language))
# 判斷傳進(jìn)來的參數(shù)是否屬于Programer對(duì)象,如果是,直接調(diào)用對(duì)象的self_introduction()方法
def introduce(programer):
if isinstance(programer,Programer):
programer.self_introduction()
if __name__ == '__main__':
# 將對(duì)象實(shí)例化
programer = Programer('Albert',25,80)
backend_programer = BackendProgramer('Tim',30,70,'Python')
introduce(programer)
introduce(backend_programer)
運(yùn)行結(jié)果:
My Name is Albert
I am 25 years old
My Name is Tim
My favorite language is Python
多態(tài)優(yōu)點(diǎn):
添加功能比較簡(jiǎn)單,只要判斷是否屬于這個(gè)父類,而不需要判斷傳進(jìn)來的是哪個(gè)子類,直擊調(diào)用這個(gè)方法。
總結(jié)
以上是生活随笔為你收集整理的python 完全面向对象_python 面向对象(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python爬虫深入爬取_Python爬
- 下一篇: 基于python技术的自动化运维是干嘛的