首頁 > 後端開發 > Python教學 > 給小白整理的第三篇Python知識點

給小白整理的第三篇Python知識點

coldplay.xixi
發布: 2020-11-13 16:47:56
轉載
1919 人瀏覽過

python影片教學專欄介紹第三篇Python知識點。

給小白整理的第三篇Python知識點

本文是第三篇,共四篇打下Python基礎

上面兩個基本上搞定了Python中資料結構,下面花一篇講講最重要的類別。

7、物件導向程式設計

萬物皆是對象,Python當然支援物件導向程式設計。類別和對像是物件導向程式設計的兩個主要方面,類別創建一個新的對象,而對象就是這個類別的實例。

物件可以使用類別的變量,屬於物件或類別的變數稱為域;物件也可以使用屬於類別的函數,這樣的函數稱為類別的方法;域和方法可以合稱為類別的屬性。

域有兩種類型

  • 屬於實例的
  • 屬於類別本身

它們分別被稱為實例變數和類別變數。

類別使用關鍵字class創建,類別的網域和方法被列在一個縮排區塊中。

類別的方法必須有一個額外的第一個參數,但是在呼叫時不為這個參數賦值,這個特殊變數指物件本身,按照慣例它的名稱是self,類似Java中的this。

在類別中下面兩個特都方法需要注意:

  • __init__方法:在類別的一個物件被建立時呼叫該方法;相當於c 中的建構函數,就是當這個類別呼叫了,那麼這個__init__ 方法就要執行。

  • __del__方法:在類別的物件被銷毀時呼叫該方法;相當於c 中的析構函數。在使用del刪除一個物件時也就呼叫__del__方法,__del__是最後呼叫的。

Python中所有的類別成員(包括資料成員)都是public的,沒有Java的私有類,也就是人人都有呼叫類,雖然編寫變成很簡單, 但是資源人人都可以隨意分配訪問,在專案中確實一個不好的東西。

但是Python 類別的卻有私有變數和私有方法之說,這個是例外,如果使用的資料成員以雙底線為前綴,則為私有變數。

你實例化這個類,訪問不了。這是很多人忽略的

例如:

class public():
    _name = 'protected类型的变量'
    __info = '私有类型的变量'
    def _f(self):
        print("这是一个protected类型的方法")    def __f2(self):
        print('这是一个私有类型的方法')    def get(self):
        return(self.__info)
pub = public()# 先打印可以访问的print(pub._name)
pub._f()####结果如下####protected类型的变量
这是一个protected类型的方法# 打印下类 私有变量和私有方法print(pub.__info)
报错:'public' object has no attribute '__info'pub._f2()
报错:pub._f2()复制代码
登入後複製

但是私有屬性和方法可以在同一個類別中被呼叫

pub.get()#######'私有类型的变量'复制代码
登入後複製

上面是很多人不知道的,下面,我來宣告一個Person類別

   class Person():
    Count = 0
    def __init__(self, name, age):
        Person.Count += 1
        self.name = name
        self.__age = age
    
p = Person("Runsen", 20)

print(p.Count)# 1 说明我实例化,这个__init__方法就要执行print(p.name) #Runsenprint (p.__age) 
#AttributeError: Person instance has no attribute '__age'#私有变量访问不了,报错复制代码
登入後複製

8、繼承

物件導向程式設計(OOP),英文全名為:Object Oriented Programming,物件導向程式設計的一個主要功能就是「繼承」。繼承是指這樣一種能力:它可以使用現有類別的所有功能,並在無需重新編寫原始的類別的情況下對這些功能進行擴展。

繼承,其實這樣理解,就是我寫了一個爸爸類和兒子類,爸爸有錢,兒子卻沒錢,於是兒子決定繼承爸爸,調用爸爸的錢(爸爸類的變量和方法) 。

繼承一個類,基本上使用下面的五個方法。

8.1 直接呼叫父類別屬性方法;

爸爸有錢,兒子卻沒錢,於是兒子用爸爸的錢

class Father():
    def __init__(self):
        self.money= 1000 
    def action(self):
        print('调用父类的方法') 
class Son(Father):
    pass
 son=Son()     # 子类Son 继承父类Father的所有属性和方法son.action()  # 调用父类属性输出:调用父类的方法
son.money     # 调用父类属性输出:1000复制代码
登入後複製

8,2 強制呼叫父類私有屬性方法;

爸爸說,你這個兒子,老是用我的錢,我決定藏私房錢。兒子試試super()拿你的私房錢,但這裡要注意super()強制呼叫父類別私有屬性方法,就是重寫方法,私有變數是不能用supper繼承不了,還不可以存取父類別中的私有屬性方法的變量,就是兒子是拿不了私房錢的。

class Father():
    __money  = 1000 #私有变量是继承不了
    
    def __action(self):  # 父类的私有方法
        money = 1000
        print('调用父类的方法') 
class Son(Father):
        
    def action(self):
        super()._Father__action()
        print(money) 
        
son=Son()
son.action() 

调用父类的方法
name 'money' is not defined复制代码
登入後複製

8.3 重寫父類別屬性方法;

突然間兒子竟然有錢,決定不用爸爸的錢,用自己的錢,決定重寫父類別屬性方法。

class Father():
    def __init__(self):
        self.money = 0
    
    def action(self):
        print('调用父类的方法') 
class Son(Father):
    def __init__(self):
        self.money = 1000
      
    def action(self):
        print('子类重写父类的方法')
 
son=Son()     # 子类Son继承父类Father的所有属性和方法son.action()  # 子类Son调用自身的action方法而不是父类的action方法son.money     # 自己的1000复制代码
登入後複製

8.4 呼叫父類別的__init__方法

如果爸爸把錢放在__init__,兒子有沒有可能拿到爸爸的錢,都不是私有變量,就不是私房錢,當然可以拿到

我們先看看如果不用super,能不能拿到。

class Father():
    def __init__(self):
        self.money = 1000
 class Son(Father):
    def __init__(self):
        pass
    son=Son()
print(son.money)# 报错:'Son' object has no attribute 'money'复制代码
登入後複製

連super不用像拿錢,太小看你爸爸我了。

class Father():
    def __init__(self):
        self.money = 1000
 class Son(Father):
    def __init__(self):
        super().__init__()        #也可以用 Father.__init__(self)  这里面的self一定要加上(上面两个相同)
        
        son=Son()
print(son.money) 

1000复制代码
登入後複製

8.5 繼承父類別初始化過程中的參數

有的時候,爸爸需要賺錢和花錢,就是我們初始化過程中的參數,兒子很好奇,決定看看爸爸口袋還要多少錢。

我們這裡先寫死了earn_money和s​​pend_money

class Father():
    def __init__(self):
        self.earn_money=1000
        self.spend_money= -500
 class Son(Father):
    def __init__(self):
        super().__init__()        #也可以用 Father.__init__(self)  这里面的self一定要加上
        
    def add(self):
        return self.earn_money+self.spend_money
        
        
son=Son()
print(son.add())500复制代码
登入後複製

兒子發現爸爸錢不夠,於是偷偷的拿了點錢過來。

class Father():
    def __init__(self,a,b):
        self.earn_money = a
        self.spend_money= b    def add(self):
        return self.a + self.b 
#调用父类初始化参数a,b并增加额外参数cclass Son(Father):
    def __init__(self,a,b,c=1000):  # c固定值
        Father.__init__(self,a,b)  
        self.son_money = c        
    def add(self):
        return self.earn_money+self.spend_money + self.son_money
        
   
        
son=Son(1000,-500)   # 所以c可以不用显示表达出来print(son.add())     # 调用子类add函数1500复制代码
登入後複製

以上基本上涵蓋了Python類別的繼承,呼叫父類別的屬性和方法基礎內容,可以自己動手寫些案例,加深理解。

9、輸入/輸出

程式與使用者的互動需要使用輸入/輸出,主要包括控制台和檔案;對於控制台可以使用input和print。 input(xxx)輸入xxx, 然後讀取用戶的輸入並返回。

In [1]: input()1Out[1]: '1'复制代码
登入後複製

10、文件输入/输出

可以使用file类打开一个文件,使用file的read、readline和write来恰当的读写文件。对文件读写能力取决于打开文件时使用的模式, 常用模式

  • 读模式("r")
  • 写模式("w")
  • 追加模式("a")

文件操作之后需要调用close方法来关闭文件。如果用with open就不用slose了。

还有r+,w+,a+

  • r:仅仅表示读入
  • r+:既可以读取还可以写入
  • w: 仅仅表示写入
  • w+:既可以读取还可以写入

但r+与w+不同的是,不会把原先存在txt中的东西清空,下面是他们的对比,反正尽量用a+,基本没什么错报出来。

描述 r+ w+ a+
当前文件不存在时文件 抛出异常 创建文件 创建文件
打开后原文件内容 保留 清空 保留
初始位置 0 0 文件尾
写入位置 标记位置 标记位置 写入时默认跳至文件尾

补充个例子吧:

test = '''\
This is a program about file I/O.
Author: Runsen
Date: 2020/3/31
'''f = open("test.txt", "w") 
f.write(test) 
f.close() 

f = open("test.txt") #默认rwhile True:
    line = f.readline()    if len(line) == 0:  
        break
    print(line)
f.close()######This is a program about file I/O.

Author: Runsen

Date: 2020/3/31复制代码
登入後複製

11、存储器

存储器,大家应该不知道。python提供一个标准的模块,成为pickle,使用它可以在一个文件中存储任何python对象,之后可以完整的取出来,这被称为持久地存储对象;还有另外一个模块成为cPickle,它的功能和pickle完全一样,只不过它是用c写的,要比pickle速度快(大约快1000倍)。

import pickle

datafile = "data.data"mylist = ["Runsen", "is", "20"]

f = open("test.txt", "wb+")
pickle.dump(mylist, f)
f.close()del mylist

f = open(datafile,'rb+')
mylist = pickle.load(f)

print(mylist)#["Runsen", "is", "20"]复制代码
登入後複製

12、异常

当程序中出现某些异常的状况时,异常就发生了。

python中可以使用try ... except 处理。

try:    print (1/0)except ZeropisionError as e:
    print(e)except:
    print( "error or exception occurred.")#integer pision or modulo by zero复制代码
登入後複製

相关免费学习推荐:python视频教程

以上是給小白整理的第三篇Python知識點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:juejin.im
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板