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

Python面向對象編程(一)

 更新時間:2022年05月30日 09:16:36   作者:springsnow  
本文詳細講解了Python的面向對象編程,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Python面向對象編程(一)

Python面向對象編程(二)

Python面向對象編程(三)

和其它編程語言相比,Python 在盡可能不增加新的語法和語義的情況下加入了類機制。

Python中的類提供了面向對象編程的所有基本功能:類的繼承機制允許多個基類,派生類可以覆蓋基類中的任何方法,方法中可以調用基類中的同名方法。

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

一、程序中定義類和對象

1、 定義類

定義函數(shù)時,函數(shù)只檢測語法,不執(zhí)行代碼,但是定義類的時候,類體代碼會在類定義階段就立刻執(zhí)行,并且會產生一個類的名稱空間,也就是說類的本身其實就是一個容器/名稱空間(__dict__),是用來存放名字的,這是類的用途之一。

語法格式如下:

class ClassName:
    
    .
    .
    .

類實例化后,可以使用其屬性,實際上,創(chuàng)建一個類之后,可以通過類名訪問其屬性。

使用類名訪問其屬性:

# 注意類中定義變量使用駝峰體
class OldboyStudent():
    school = 'oldboy'

    def choose_course(self):
        print('is choosing course')


print(OldboyStudent.__dict__)
# {'__module__': '__main__', 'school': 'oldboy', 'choose_course': , '__dict__': <attribute '__dict__' of 'OldboyStudent' objects>, '__weakref__': <attribute '__weakref__' of 'OldboyStudent' objects>, '__doc__': None}

print(OldboyStudent.__dict__['school'])
# oldboy


print(OldboyStudent.__dict__['choose_course'])
#


try:
    OldboyStudent.__dict__['choose_course']()
except Exception as e:
    print('error:', e)
# error: choose_course() missing 1 required positional argument: 'self'


print(OldboyStudent.school)
# oldboy


print(OldboyStudent.choose_course(111))
# is choosing course


print(OldboyStudent.choose_course)
#


OldboyStudent.country = 'China'
print(OldboyStudent.__dict__['country'])
# 'China'
delOldboyStudent.school
print(OldboyStudent.__dict__)
# {'__module__': '__main__', 'choose_course': , '__dict__': <attribute '__dict__' of 'OldboyStudent' objects>, '__weakref__': <attribute '__weakref__' of 'OldboyStudent' objects>, '__doc__': None, 'country': 'CHINA'}

2、 定義對象

調用類即可產生對象,調用類的過程,又稱為類的實例化,實例化的結果稱為類的對象/實例。

stu1 = OldboyStudent()  # 調用類會得到一個返回值,該返回值就是類的一個具體存在的對象/實例
print(stu1.school)  # oldboy

stu2 = OldboyStudent()  # 調用類會得到一個返回值,該返回值就是類的一個具體存在的對象/實例
print(stu2.school)  # oldboy

stu3 = OldboyStudent()  # 調用類會得到一個返回值,該返回值就是類的一個具體存在的對象/實例
stu3.choose_course()  # is choosing course

二、定制對象獨有特征

1、引入

對于上述的學生類,如果類的屬性改了,則其他對象的屬性也會隨之改變

class OldboyStudent():
    school = 'oldboy'

    def choose_course(self):
        print('is choosing course')


stu1 = OldboyStudent()
stu2 = OldboyStudent()

<strong>OldboyStudent.school</strong> = 'OLDBOY'
print(stu1.school)  # <strong>OLDBOY</strong>

print(stu2.school)  # OLDBOY

2、定制對象獨有特征

對象本質類似于類,也是一個名稱空間,但是對象的名稱空間存放對象獨有的名字,而類中存放的是對象們共有的名字。

因此我們可以直接為對象單獨定制名字。

print(stu1.__dict__)  # {}
print(stu2.__dict__)  # {}

stu1.name = 'tank'
stu1.age = 18
stu1.gender = 'male'

print(stu1.name, stu1.age, stu1.gender)
# tank 18 male

try:
    print(stu2.name, stu2.age, stu2.gender)
except Exception as e:
    print(e)
# 'OldboyStudent' object has no attribute 'name'

stu2.name = 'sean'
stu2.age = 19
stu2.gender = 'female'

print(stu2.name, stu2.age, stu2.gender)
# sean 19 female

3、對象屬性查找順序

首先從自身查找,沒找到往類中找,類中沒有則會報錯。即對象的屬性查找順序為:自身—>類—>父類—>報錯。

class OldboyStudent:
    school = 'oldboy'
    count = 0
    aa = 10 #類的的公共變量aa


    def __init__(self, x, y, z):  # 會在調用類時自動觸發(fā)
        self.name = x  # stu1.name='耗哥'
        self.age = y  # stu1.age=18
        self.sex = z  # stu1.sex='male'
        OldboyStudent.count += 1
        # self.count += 1
        self.aa = 1 #對象的私有變量aa

    def choose_course(self):
        print('is choosing course')


print(OldboyStudent.count)  # 0

stu1 = OldboyStudent('nick', 18, 'male')
print(stu1.count)  # 1

stu2 = OldboyStudent('sean', 17, 'male')
print(stu2.count)  # 2

stu3 = OldboyStudent('tank', 19, 'female')
print(stu3.count)  # 3

print(OldboyStudent.count)  # 3


# 由于上述修改的是類屬性,類屬性的count已經被修改為3,所以其他實例的count都為3
print(stu1.count)  # 3
print(stu2.count)  # 3
print(stu3.count)  # 3

# 由于aa是私有屬性,因此stu們都會用自己私有的aa,不會用類的aa。count也不屬于對象
print(stu1.__dict__)  # {'name': 'nick', 'age': 18, 'sex': 'male', 'aa': 1}
print(stu2.__dict__)  # {'name': 'sean', 'age': 17, 'sex': 'male', 'aa': 1}
print(stu3.__dict__)  # {'name': 'tank', 'age': 19, 'sex': 'female', 'aa': 1}

4、類定義階段定制屬性

類有一個名為 __init__() 的特殊方法(構造方法),該方法在類實例化時會自動調用。

調用類時發(fā)生兩件事:

  • 創(chuàng)造一個空對象
  • 自動觸發(fā)類中__init__功能的執(zhí)行,將stu1以及調用類括號內的參數(shù)一同傳入。
class OldboyStudent:
    school = 'oldboy'

    def __init__(self, name, age, gender):
        """調用類的時候自動觸發(fā)"""
        self.name = name
        self.age = age
        self.gender = gender
        print('*' * 50)

    def choose_course(self):
        print('is choosing course')


try:
    stu1 = OldboyStudent()
except Exception as e:
    print(e)
# __init__() missing 3 required positional arguments: 'name', 'age', and 'gender'

stu1 = OldboyStudent('nick', 18, 'male')
# **************************************************


print(stu1.__dict__) 
# {'name': 'nick', 'age': 18, 'gender': 'male'} #沒有school

三、對象的綁定方法

  • 類名稱空間中定義的數(shù)據(jù)屬性和函數(shù)屬性都是共享給所有對象用的

  • 對象名稱空間中定義的只有數(shù)據(jù)屬性,而且是對象所獨有的數(shù)據(jù)屬性。

1、類使用對象的綁定對象

類中定義的函數(shù)是類的函數(shù)屬性,類可以使用它,但使用的就是一個普通的函數(shù)而已,意味著需要完全遵循函數(shù)的參數(shù)規(guī)則,該傳幾個值就傳幾個

class OldboyStudent:
    school = 'oldboy'

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.sex = gender

    def choose_course(self):
        print(f'{self.name} choosing course')

    def func(self):
        print('from func')


print(OldboyStudent.choose_course)
# <function OldboyStudent.choose_course at 0x00000000023AEF70>

try:
    OldboyStudent.choose_course(123)
except Exception as e:
    print(e)
# 'int' object has no attribute 'name'

2、對象使用對象的綁定方法

  • 類中定義的函數(shù)是共享給所有對象的,對象也可以使用,而且是綁定給對象用的,

  • 綁定的效果:綁定給誰,就應該由誰來調用,誰來調用就會將誰當作第一個參數(shù)自動傳入。

類中定義的函數(shù),類確實可以使用,但其實類定義的函數(shù)大多情況下都是綁定給對象用的,所以在類中定義的函數(shù)都應該自帶一個參數(shù)self。

self代表類的實例,而非類

類的方法與普通的函數(shù)只有一個特別的區(qū)別——它們必須有一個額外的第一個參數(shù)名稱, 按照慣例它的名稱是 self,self 代表的是類的實例。

self 不是 python 關鍵字,我們把他換成 aaabbb也是可以正常執(zhí)行的:

class OldboyStudent:
    school = 'oldboy'

    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.sex = gender

    def choose_course(self):
        print(f'{self.name} choosing course')

    def func(self):
        print('from func')


stu1 = OldboyStudent('nick', 18, 'male')
stu2 = OldboyStudent('sean', 17, 'male')
stu3 = OldboyStudent('tank', 19, 'female')

stu1.choose_course() #相當于 OldboyStudent.choose_course(stul) 對象調對象綁定的方法,會自動傳參
# nick choosing course

stu2.choose_course()
# sean choosing course

stu3.choose_course()
# tank choosing course

stu1.func()
# from func
stu2.func()
# from func

四、類與數(shù)據(jù)類型

python3中統(tǒng)一了類與類型的概念,類就是類型

class Foo:
def __init__(self,name):
        self.name = name

f = Foo('name')

obj = Foo()
print(type(obj))
# <class '__main__.Foo'>


lis = [1, 2, 3] # 相當于 lis = list([1,2,3])
print(type(lis))
# <class 'list'>
 
lis.append(4)  # 對象調對象綁定的方法,會自動傳參
list.append(lis,4)  # 類調用對象綁定的方法,必須得傳參

對象其實就是一個高度整合的產物,整合數(shù)據(jù)與專門操作該數(shù)據(jù)的方法(綁定方法)

import pymysql

class Foo:
    def __init__(self, host, port, db, chartset):
        self.host = host
        self.port = port
        self.db = db
        self.charset = chartset

    def exc1(self, sql):
        conn = pymysql.connect(self.host, self.port, self.db, self.charset)
        conn.execute(sql)
        return xxx

    def exc2(self, proc_name):
        conn = pymysql.connect(self.host, self.port, self.db, self.charsett)
        conn.call_proc(proc_name)
        return xxx


obj1 = Foo('1.1.1.1', 3306, 'db1', 'utf-8')
obj1.exc1('select * from t1')
obj1.exc1('select * from t2')

obj2 = Foo('1.1.1.2', 3306, 'db1', 'utf-8')
obj2.exc1('select * from t4')

到此這篇關于Python面向對象編程的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python獲取時間戳的多種方法總結

    Python獲取時間戳的多種方法總結

    時間戳是一個表示日期和時間的數(shù)值,通常以秒為單位,在Python中,獲取時間戳是常見的任務,用于記錄事件、計時操作、以及在各種應用中跟蹤時間,本文將介紹多種獲取時間戳的方法,包括標準庫和第三方庫的方式,并提供示例代碼以幫助你更好地理解
    2023-11-11
  • Python文本預處理學習指南

    Python文本預處理學習指南

    文本預處理是指在進行自然語言處理(NLP)任務之前,對原始文本數(shù)據(jù)進行清洗、轉換和標準化的過程,本文主要為大家介紹了文本預處理的使用,需要的可以參考下
    2023-07-07
  • python計算列表元素與乘積詳情

    python計算列表元素與乘積詳情

    這篇文章主要介紹了python計算列表元素與乘積,文章圍繞主題展開詳細內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • 對Python3 * 和 ** 運算符詳解

    對Python3 * 和 ** 運算符詳解

    今天小編就為大家分享一篇對Python3 * 和 ** 運算符詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python數(shù)據(jù)結構與算法之列表(鏈表,linked list)簡單實現(xiàn)

    Python數(shù)據(jù)結構與算法之列表(鏈表,linked list)簡單實現(xiàn)

    這篇文章主要介紹了Python數(shù)據(jù)結構與算法之列表(鏈表,linked list)簡單實現(xiàn),具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Python如何將bmp格式的圖片批量轉成jpg

    Python如何將bmp格式的圖片批量轉成jpg

    這篇文章主要介紹了Python如何將bmp格式的圖片批量轉成jpg問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Flask請求鉤子與上下文及異常處理分項精解

    Flask請求鉤子與上下文及異常處理分項精解

    這篇文章主要介紹了Flask請求鉤子與上下文及異常處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • 淺談Python數(shù)學建模之數(shù)據(jù)導入

    淺談Python數(shù)學建模之數(shù)據(jù)導入

    數(shù)據(jù)導入是所有數(shù)模編程的第一步,比你想象的更重要。Python 語言中數(shù)據(jù)導入的方法很多。對于數(shù)學建模問題編程來說,選擇什么方法最好呢?答案是:沒有最好的,只有最合適的。對于不同的問題,不同的算法,以及所調用工具包的不同實現(xiàn)方法,對于數(shù)據(jù)就會有不同的要求
    2021-06-06
  • Python多線程與多處理之間的區(qū)別詳解

    Python多線程與多處理之間的區(qū)別詳解

    在本文中,我們將學習 Python 中多線程和多處理的內容、原因和方式,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • python復制與引用用法分析

    python復制與引用用法分析

    這篇文章主要介紹了python復制與引用,實例分析了python中復制與引用的具體使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-04-04

最新評論