1. 程式人生 > >Python3 【類】類基礎知識

Python3 【類】類基礎知識

文章目錄

建立類

類的建立以class開頭,之後跟著名字,並以冒號結尾。(建議類的名字使用駝峰式記法:一大些字母開頭,並且隨後緊跟的任意一個單詞都要以大寫字母開頭)。注意Python中不需要括號,直接通過縮排就可以管理。
下面建立一個最簡單的類

class MyFirstClass:  
    class_suite=0

使用命令pyhton -i firsrt_class.py

執行這段程式碼,-i 的意思是執行這段程式碼之後,拋向互動直譯器。

>>> a=MyFirstClass()
>>> print(a)
<__main__.MyFirstClass object at 0x7f70900f16d8>
>>> print(a.class_suite)
0

對一個已經例項化了的類,可以通過點運算子賦予任意屬性。例如接著上面的執行。

>>> a.x=5
>>> a.y=10
>>> print(a.x,a.y)
5 10

定義方法

所謂的方法,其實就是函式,只不過是出現在類中的函式而已。python中方法的定義和函式相同,以關鍵字def開頭。注意,所有方法都必須有一個引數,那就是self。

self引數,是對呼叫這個方法的物件的一個引用。

class Apple:
    color=10
    weight=12
    def reset(self):
        self.color=0
        self.weight=0
>>> apple=Apple()
>>> print(apple.color,apple.weight)
10 12
>>> apple.reset()
>>> print(apple.color,apple.weight)
0 0

物件的初始化

大部分面嚮物件語言都有一個建構函式的特殊方法。但是Python不同,Python有一個建構函式和一個初始化函式,正常情況下,建構函式很少使用。Python的初始化方法和其他方法沒有什麼不同。只不過是有一個特殊的名字“__init__”,開始和結尾的雙下劃線表示這是一個特殊的方法。對自己定義函式,不要使用雙下劃線。
例如:

class Apple:
    def __init__(self, color, weight):
        self.color=color
        self.weight=weight
>>> apple=Apple("red",100)
>>> print(apple.color,apple.weight)
red 100

定義的這個函式就是用於初始化的函式,通過執行可以看出他的使用方式。其實和其他語言裡面的建構函式是很相似的。

模組和包

當建立的類很多的時候,為了方便管理,不宜全部放在一個檔案中,這時就會用到模組。模組就是非常簡單的Python檔案,單個Python檔案就是一個模組,兩個檔案就是兩個模組。import函式就是用來匯入模組或者從模組中匯入特定的類或者函式。
包就是放到一個資料夾裡的模組的集合。包的名字就是資料夾的名字。我們需要做的只是告訴Python這個資料夾是一個包,並且把一個名為__init__.py的檔案(通常是空的)放到這個資料夾裡。如果忘記建立這個檔案,就沒法從這個資料夾裡匯入那些模組
下面是一個檔案關係的例子,每一個包都應該包含一個 __init__檔案。
在這裡插入圖片描述

管理模組

包之間匯入模組或者類的時候,要注意語法。Python3中,匯入模組有兩種方式:絕對匯入和相對匯入。

絕對匯入

絕對匯入需要指明這個模組、函式的完整路徑。以上面給出的檔案路徑為例,如果我們需要訪問products模組裡的Product類,可以使用下面的方法絕對匯入:

import ecommerce.products
product = emomerce.products.Product()

或者

from ecommerce.products import Product
product = Product()

或者

from ecommerce import products
product = products.Product()

相對匯入

當處理一個包裡的相關模組時,詳細指明完整路徑是沒有必要的。因為他們本身就在一個資料夾下。例如database.py和products.py是兩個並列的的模組。例如,當前正在products這個模組下面工作,從database模組匯入可以使用相對匯入:
from .database import Database
如果需要訪問上一級檔案的內容,可以加兩個點。這一點和linux下的檔案路徑操作是一樣的。例如:
from ..contact.email import send_email

當匯入模組的時候,模組裡的所有程式碼都會被立即執行。如果模組裡的是一個方法或者一個方法或者函式,就會建立這個函式,並且這個函式裡的程式碼知道函式被呼叫的時候才會執行。通常,我們會寫一個程式來讓它做一些事情,但是當我們想要從另一個模組匯入一些函式或者類,只要匯入了它,那麼被匯入的模組裡的所有程式碼就會立即執行。當我們只是想訪問那個模組裡的一些函式的時候,如果不小心,可能會把當前正在執行的程式終止掉。
為了解決這個問題,我們應該把啟動程式碼放到一個函式裡(通常寫做main函式)

class MyClass :
	...
def main():
	a=MyClass()
	print(a)
if __name__ == "__main__":
	main()

每一個模組都有一個特殊的變數__name__,當匯入這個模組的時候,這個變數指明瞭模組的名字。當匯入這個模組的時候,這個變數指明瞭模組的名字。
注意
__name__是每一個模組內建的一個變數。一個模組的__name__的值取決於您如何應用模組。如果是匯入一個模組,那麼模組__name__ 的值是模組檔名,不帶路徑或者副檔名。直接執行模組的時候,name 的值將是"main"。這就意味著,當模組被直接執行的時候,將執行這個判斷語句下面的程式,當模組被匯入的時候,這個判斷語句下的程式碼塊不會被執行。這樣就避免了每次已匯入模組就執行模組裡的所有執行程式。

訪問許可權

Python沒有強制的許可權限制,比如設定private,protected,public,這些Python都沒有。
一個類裡的所有方法和數學都是公共可以訪問的。如果我們可以給一個屬性或者方法加一個下劃線的 字首,“表明這是一個內部變數,直接訪問它之前請三思”。但是這只是告訴程式設計者儘量不要訪問,但是並不阻止訪問。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Nov 22 21:14:50 2018

@author: zhao
"""

import datetime

last_id=0

class Note:
    '''Represent a note in the notebook.Match against a
    string in searches and store tags for each note.'''
    
    def __init__(self, memo, tags=''):
        '''initialize a note with memo and optional
        space-separated tags. Automatically set the note's
        creation date and a unique id.'''
        self.memo = memo
        self.tags = tags
        self.creation_date = datetime.date.today()
        global last_id
        last_id += 1
        self.id = last_id
    
    def match(self,filter):
        '''Determine if this note matches the filter
        text. Return True if it matches,False otherwise.
        
        Search is case sensitive and matches both text and tags.'''
        return filter in self.memo or filter in self.tags
        
class Notebook:
    '''Represent a collection of notes that can be tagged,
    modified, and searched.'''
    
    def __init__(self):
        '''initialize a notebook with an empty list.'''
        self.notes=[]
        
    def new_note(self, memo, tags=''):
        '''Create a new note and add it to the list.'''
        self.notes.append(Note(memo,tags))
    
    def modify_memo(self, note_id,memo):
        '''Find the note with the given id and change its
        memo to the given value'''
        self._find_note(note_id).memo = memo
            
    def modify_tags(self, note_id, tags):
        '''Fiind the note with the given id and change its
        tags to the given value.'''
        for note in self.notes:
            if note.id == note_id:
                note.tags = tags
                break
    
    def search(self, filter):
        '''Find all notes that match the given filter string.'''
        return [note for note in self.notes if note.match(filter)]
        
    def _find_note(self,note_id):
        '''locate the note with the given id.'''
        for note in self.notes:
            if note.id == note_id:
                return note
        return None

import sys

class Menu:
    '''Display a memu and respond to choices when run.'''
    def __init__(self):
        self.notebook = Notebook() #attention
        self.choices = {
                "1" : self.show_notes,
                "2" : self.search_notes,
                "3" : self.add_note,
                "4" : self.modify_note,
                "5" : self.quit
                }
    def display_menu(self):
        print("""
Notebook Menu

1.Show all Notes
2.search Notes
3.Add Note
4.Modify Note
5.Quite
""")
        
    def run(self):
        '''Display the menu and respond to choice.'''
        while True:
            self.display_menu()
            choice = input("Enter an option: ")
            action = self.choices.get(choice)
            if action:
                action()
            else:
                print("{0} is not a valid choice".format(choice))
    
    def show_notes(self, notes=None):
        if not notes:
            notes = self.notebook.notes
        for note in notes:
            print("{0}: {1}\{2}".format(
                    note.id, note.tags, note.memo))
    def search_notes(self):
        filter = input("Search for: ")
        notes = self.notebook.search(filter)
        self.show_notes(notes)
        
    def add_note(self):
        memo = input("Enter a memo: ")
        self.notebook.new_note(memo)
        print("Your note has been adden.")
        
    def modify_note(self):
        id = input("Enter a note id: ")
        memo = input("Enter a memo: ")
        tags = input("Enter tags: ")
        if memo:
            self.notebook.modify_memo(id,memo)
        if tags:
            self.notebook.modify_tags(id,tags)
    
    def quit(self):
        print("Thank you for using your notebook today.")
        sys.exit(0)
    
if __name__ == "__main__":
    Menu().run()  #pay attention to the way which uses the method