Python 物件導向

2021-08-27 02:58:23 字數 4709 閱讀 2744

1、檢視類的屬性字典。類去呼叫自己的類的屬性字典,物件去呼叫顯示傳給init的引數,先找例項物件的字典,再找類物件的字典,然後報錯

class test:

gender = 'male'

def __init__(self, name, age):

self.name = name

self.age = age

def hand(self):

print('2333')

test = test('jax', '19')

print(test.__dict__) # 檢視屬性字典

print(test.__dict__)

>>>

>>>

2、其他屬性

class test:

'''test for python'''

gender = 'male'

def __init__(self, name, age):

self.name = name

self.age = age

def hand(self):

print('2333')

test = test('jax', '19')

# __class__: 顯示類本身

print(test.__class__)

>>> # __name__: 檢視類的名字

print(test.__name__)

>>> test

# __bases__: 檢視繼承 以元組的形式顯示

print(test.__bases__)

>>> (,) # py3預設所有的類都是object的子類

# __base__: 檢視繼承

print(test.__base__)

>>> # __doc__: 檢視文件字串,無法被繼承,因為每初始化乙個類就會自動新增這個屬性其值為none

print(test.__doc__)

>>> test for python

# __module__: 顯示類所在哪個模組

print(test.__module__)

>>> __main__

3、類屬性的改動:

例項只有資料屬性,沒有函式屬性,函式屬性是在類的屬性中找到的

增加乙個類變數  ,對其進行直接賦值,可以是類也可以是物件去呼叫方法

class test:

name = 'zyz'

def pp(self):

print('2333')

test = test()

print(test.__dict__)

# 新增屬性

print(test.__dict__)

>>> {}

也可以增加乙個函式屬性,後面賦值函式位址

class test:

name = 'zyz'

def pp(self):

print('2333')

def eat_food():

print('2333')

test = test()

>>> 2333

刪除屬性,用del關鍵字

class test:

name = 'zyz'

def pp(self):

print('2333')

print(test.__dict__)

del test.name

print(test.__dict__)

>>>

>>>

修改屬性值,重新對其進行賦值。永久性的修改當前例項物件的字典,在例項其他物件時並不會改變

class test:

name = 'zyz'

def pp(self):

print('2333')

test = test()

print(test.__dict__)

print(test.__dict__)

如果存在乙個屬性是列表,當其中乙個例項物件修改列表時,其他物件都會拿到修改後的列表,直接修改了類的屬性

class test:

x = ['a', 'b']

def test(self):

print('2333')

p1 = test()

p2 = test()

print(p1.x)

print(p1.__dict__)

print(test.x)

print(p2.x)

>>> ['a', 'b']

>>> {}

>>> ['a', 'b', 'c']

>>> ['a', 'b', 'c']

在python 2  裡面將類的格式分為經典類和新式類。python3 裡不再區分這兩種類,沒有這個概念了。在python裡面支援多繼承

經典類:繼承順序遵循深度優先(先從樹的左邊開始找,找到最後節點的前乙個節點回來找右面的,一直找到基類)

class test:

name = 'classical'

def test(self):

print('這是經典類')

新式類:繼承順序遵循廣度優先

class test(object):

name = 'new'

def test(self):

print('new class')

具體的類的繼承順序可以通過檢視類的__mro__屬性:

class a(object):

def name(self):

print('a')

class b(a):

def name(self):

print('b')

class c(a):

def name(self):

print('c')

class d(b):

def name(self):

print('d')

class e(c):

def name(self):

print('e')

class f(d,e):

def name(self):

print('f')

print(f.__mro__)

>>> (, , , , , , )

__mro__:

檢視多個類繼承的順序  

mro遵循1、子類會先於父類被檢查

2、多個父類會根據在mro列表中檢查

3、如果有兩個合法選擇會找第乙個父類

當使用super進行方法呼叫時就會按照mro順序進行初始化,並不會出現最終的父類呼叫兩次的情況

class a(object):

def name(self):

print('a')

class b(a):

def name(self):

print('b')

super().name()

class c(a):

def name(self):

print('c')

super().name()

class d(b):

def name(self):

print('d')

super().name()

class e(c):

def name(self):

print('e')

super().name()

class f(d, e):

def name(self):

print('f')

super().name()

>>> f

>>> d

>>> b

>>> e

>>> c

>>> a

多型就是類的這兩層意義的乙個具體的實現機制,即呼叫不同的例項化得物件下的相同方法,實現的過程不一樣

有單繼承和多繼承(以逗號分隔),繼承的兩種形式

1、繼承基類的方法,做出自己的改變或拓展,**重用

2、宣告某個子類,定義乙個介面類,子類繼承介面類,並且實現介面中定義的全部方法,方便歸一化設計

介面類:通過匯入乙個庫abc,實現介面類介面類,介面類繼承metaclass = abc.abcmeta,在介面類的方法前加上@abc.abstractmethod裝飾器(抽象方法)。介面類要求全部繼承,但是可以不實現,否則報錯

import abc

class test(metaclass=abc.abcmeta):

@abc.abstractmethod

def see(self):

pass

@abc.abstractmethod

def eat(self):

pass

class people(test):

def see(self):

print('beautiful things')

def eat(self):

print('delicious')

p = people()

p.see()

>>> beautiful things

python物件導向學習 python物件導向學習

物件導向最重要的概念就是類 class 和例項 instance 必須牢記類是抽象的模板,比如student類,而例項是根據類建立出來的乙個個具體的 物件 每個物件都擁有相同的方法,但各自的資料可能不同。物件導向三個概念 1.封裝 即把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法讓可信的類進...

python物件導向總結 Python物件導向總結

python 物件導向 oop 1 物件導向 是乙個更大封裝,把乙個物件封裝多個方法 2 類 是對一些具有相同特徵或行為的事物的乙個統稱,是抽象的,不能直接使用 特徵被稱為屬性 行為被稱為方法 3 物件 是由類建立出來的乙個具體的存在,可以直接使用 先有類再有物件,類只有乙個,而物件可以有多個 類中...

python登入物件導向 python 物件導向

一 屬性和方法 1.a a 例項屬性 通過例項物件來新增的屬性就是例項屬性 a.count 10 例項方法都是在類中直接定義的 以self為第乙個引數的方法都是例項方法 當通過例項物件呼叫時,會自動傳遞當前物件作為self傳入 當通過類物件呼叫時,不會自動傳遞self a.test 等價於 a.te...