對於某個函式,如果我們希望在不改變該函式**的前提下,為該函式增加額外的功能,那麼就可以使用函式裝飾器來裝飾該函式。
def notice(func):
print("公告")
print("請注意!")
return func(*args,**kwargs)
@notice #相當於add=notice(add)
def add(a,b):
return a+b
@notice
def div(a,b):
if b!=0:
return a/b
print("1與5的和為:",add(1,5))
屬性
位置繫結屬性的方式
例項屬性
在類物件的內部(方法中)
self.屬性名=屬性值
例項屬性
在類物件的外部
例項物件.屬性名=屬性值
類屬型在類物件的內部(方法外)
屬性名=屬性值
類屬型在類物件的外部
類物件.屬性名=屬性值 屬性
位置訪問屬性的方式
例項屬性
在類物件的內部(方法中)
self.屬性名
例項屬性
在類物件的外部
例項物件.屬性名
類屬型在類物件的內部(方法中)
類物件.屬性名
類屬型在類物件的外部
類物件.屬性名or例項物件.屬性名
例項方法指只有例項物件才可以呼叫的方法。
有兩種呼叫的方式,大家認真觀察,會發現和訪問例項物件的屬性特別相似。
位置呼叫方法的方式
在類物件的內部(其它例項方法中)
self.方法名(實參)
在類物件的外部
例項物件.方法名(實參)
class myclass(object):
#在類物件中定義例項方法
def __init__(self):
print("構造方法被呼叫")
def func1(self,p1,p2):
print(p1,p2)
#在類物件中定義例項方法
def func2(self):
#在類物件內部(其他例項方法中)呼叫例項方法
self.func1(1,2)
#在例項化物件時,構造方法會被自動呼叫
mc = myclass()
#在類物件的外部呼叫例項方法
mc.func1(1,2)
mc.func2()
#定義乙個函式作為例項方法
def do_sth(self):
print("do_sth()被呼叫")
#給例項物件mc動態地繫結例項方法
from types import methodtype
mc.do_sth=methodtype(do_sth,mc)
#呼叫繫結的例項方法
mc.do_sth()
執行結果:
構造方法被呼叫
1 21 2
do_sth()被呼叫
在例項物件呼叫後,可以對其動態地繫結例項方法,這裡的例項方法對於同一類物件的其他例項物件是不起作用的。(如下所示)
mc2 = myclass()
mc2.do_sth()
執行結果:
構造方法被呼叫
attributeerror: 'myclass' object has no attribute 'do_sth'
為了讓所有的例項物件都可以呼叫某個例項方法,我們可以給類物件繫結該例項方法。
#再定義乙個函式做為例項方法
def func3(self):
print("func3()被呼叫了")
#給類物件動態地繫結例項方法
myclass.func3 = func3
#類物件的所有例項物件都可以呼叫該例項方法
mc2 = myclass()
mc.func3()
mc2.func3()
執行結果:
構造方法被呼叫
func3()被呼叫了
func3()被呼叫了
類方法指的是類物件中使用裝飾器@classmethod進行裝飾的方法,可以被該類物件的所有例項物件呼叫。
接下來介紹類方法被例項物件和類物件呼叫的語法格式。
物件位置
繫結屬性的方式
例項物件
在類物件的內部
self.類方法
例項物件
在類物件的外部
例項物件.類方法
類物件在類物件的內部
cls.類方法
類物件在類物件的外部
類物件.類方法
class myclass(object):
#在類物件中定義類方法
@classmethod
def class_func(cls,a,b):
print(a,b)
#在類物件內部通過類物件呼叫類方法
@classmethod
def class_func1(cls):
cls.class_func("hello","python")
#在類物件內部通過例項物件呼叫類方法
def func(self):
self.class_func("hello","python")
#通過類物件呼叫類方法
myclass.class_func("hello","python")
myclass.class_func1()
#通過例項物件呼叫類方法
mc = myclass()
mc.class_func("hi","c")
mc.func()
執行結果:
hello python
hello python
hi c
hello python
在類物件中定義靜態方法時,必須使用裝飾器@staticmethod進行裝飾。
被呼叫的方式和上面類方法的方式是一樣的。
感覺靜態方法跟我們在類外定義的普通函式很像,還不知道它存在的意義,以後有新的想法會過來更新。
訪問控制指的是控制類物件內部的屬性和方法在類物件的外部是否可以直接被訪問。
在類物件的屬性或者方法前面加兩個下劃線,那麼在類物件的外部就不能直接訪問呼叫。
class myclass(object):
def __init__(self):
self.__aa = 18
def __fun(self):
print("__fun()被呼叫了")
mc = myclass()
mc.__aa
mc.__fun()
執行結果:
attributeerror: 'myclass' object has no attribute '__aa'
attributeerror: 'myclass' object has no attribute '__fun'
在類物件的外部可以通過在方法名或者屬性名前面加「_類名」來訪問屬性或方法。
print(mc._myclass__aa)
mc._myclass__fun()
執行結果:
18__fun()被呼叫了
除了在類物件的屬性或者方法前面新增兩個下劃線,還可以在類物件的屬性或者方法前面新增單下劃線,這表明:雖然可以在類物件的外部訪問該屬性或者方法,但是最好不要訪問。(其實我內心是這樣的:既然不想讓別人訪問,幹嘛還要加單下劃線。。) 物件導向程式設計(一)
1 什麼是物件導向 面向將系統看成通過互動作用來萬恆特定功能的物件的集合。每個物件用自己的方法來管理資料。也就是說只有物件內部的 能夠操作物件內部的資料 2 物件導向的優點 通過,繼承 封裝 多型降低程式的耦合度,並結合設計模式讓程式更容易修改和擴充套件,並且易於復用。3 物件導向的特點 封裝 維護...
物件導向程式設計(一)
var book function id,bookname,price var book function function book newid,newname,newprice this.getname function this.getprice function this.setname f...
物件導向程式設計(一)
物件導向程式設計 類物件 物件名字的查詢順序 一切皆物件 面向過程程式設計核心是過程二字,過程指的是解決問題的步驟,基於該程式設計思想寫程式,就好比設計一條工廠流水線,即先做什麼再做什麼。優點 複雜的問題簡單化,流程化 缺點 可擴充套件性差 物件導向程式設計,核心是物件二字,好比創造世界,一種上帝式...