python面向?qū)ο螅ǘ?/h2>
元類

python中,對象是由元類創(chuàng)建的,類也是一種對象,也就是說元類就是‘類的類’
eg、電腦中的cpu、內(nèi)存等等。cpu、內(nèi)存相當(dāng)是x。
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386820064557c69858840b4c48d2b8411bc2ea9099ba000

內(nèi)置函數(shù)
內(nèi)置函數(shù) 描述
issubclass(sub, sup) 如果類 sub 是類 sup 的子類,則返回 True,反之,為 False
isinstance(obj1, obj2) 如果實例obj1是類obj2或者obj2子類的一個實例;或者如果obj1 是 obj2 的類型,則返回 True;反之,為 False。
hasattr(obj, attr) 如果 obj 有屬性 attr(用字符串給出),返回 True,反之,返回
getattr(obj, attr[, default]) 獲取 obj 的 attr 屬性;與返回 obj.attr 類似;如果 attr 不是 obj 的屬性,如果提供了默認(rèn)值,則返回默認(rèn)值;不然, 就會引發(fā)一個 AttributeError 異
setattr(obj, attr, val) 設(shè)置obj的attr屬性值為val,替換任何已存在的屬性值; 不然,就創(chuàng)建屬性;類似于 obj.attr=val
delattr(obj, attr) 從 obj 中刪除屬性 attr(以字符串給出);類似于 del obj.attr
dir(obj=None) 返回 obj 的屬性的一個列表;如果沒有給定 obj,dir()則顯示局部名字空間空間中的屬性,也就是 locals().keys()
super(type, obj=None) 返回一個表示父類類型的代理對象;如果沒有傳入 obj, 則返 回的 super 對象是非綁定的;反之,如果 obj 是一個 type , issubclass(obj,type) 必 為 True ; 否 則 , isinstance(obj,type)就必為 True
vars(obj=None) 返回 obj 的屬性及其值的一個字典;如果沒有給出 obj, vars()顯示局部名字空間字典(屬性及其值),也就是 locals()。

常用的一些方法實例

class A(object):
   def __init__(self,):
       print( 'create an instance of',self.__class__.__name__)
   @property
   def name(self):
       return self.__name
   @name.setter
   def name(self,__value):
       self.__name = __value

   def show(self):
       print(self.__name )
class B(A):
    pass
b= B()
a= A()
a.name = "limei"
print(a.show())
# 判斷是否是子類
print(issubclass(B,A))
# 判斷是否是實例或者子類的實例。是返回true,不是返回false。
print(isinstance(b,A))
print(hasattr(B,"name"))
定制類

python中有很多有特殊用途的函數(shù),可用于擴充類。
實現(xiàn): 1、模擬標(biāo)準(zhǔn)類型 2、重載操作符
**用來定制類的特殊方法 **
(http://blog.csdn.net/fdl19881/article/details/8443893)
以下只是部分,詳細(xì)看上面鏈接

內(nèi)置函數(shù) 描述
init 構(gòu)造器(帶一些可選的參數(shù))
new 構(gòu)造器
del 構(gòu)造器
str 可打印的字符輸出;內(nèi)建 str()及 print 語句
repr 運行時的字符串輸出(用于調(diào)試)
unicode Unicode 字符串輸出
call 表示可調(diào)用的實例
nonzero 為object 定義 False 值 ;內(nèi)置bool()
len “長度”(可用于類);內(nèi)建 len()
cmp 對象比較;內(nèi)建 cmp()
lt 小于/小于或等于;對應(yīng)<及<=操作符
gt 大于/大于或等于;對應(yīng)>及>=操作符
eq 等于/不等于;對應(yīng)==,!=及<>操作符
C.*add(self, obj) 加;+操作符
C.*sub(self, obj) 減;-操作符
C.*mul(self, obj) 乘;*操作符
C.*div(self, obj) 除;/操作符

新式類的常用法的解釋

 __init__    創(chuàng)建完對象后調(diào)用,對當(dāng)前對象的實例的一些初始化
__new__(cls, *args, **kwargs)  創(chuàng)建對象時調(diào)用,返回當(dāng)前對象的一個實例,只有在新式類的情況下才會有的方法

new的作用
1、主要是當(dāng)你繼承一些不可變的class時(比如int, str, tuple), 提供給你一個自定義這些類的實例化過程的途徑。還有就是實現(xiàn)自定義的metaclass
2、因為類每一次實例化后產(chǎn)生的過程都是通過__new__來控制的,所以通過重載__new__方法,我們 可以很簡單的實現(xiàn)單例模式。

class Singleton(object):
    def __new__(cls):
        # 關(guān)鍵在于這,每一次實例化的時候,我們都只會返回這同一個instance對象
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        return cls.instance
obj1 = Singleton()
obj2 = Singleton()
obj1.attr1 = 'value1'
print obj1.attr1, obj2.attr1
print obj1 is obj2
__call__
一個對象實例可以有自己的屬性和方法,當(dāng)我們調(diào)用實例方法時,我們用instance.method()來調(diào)用。能不能直接在

class Student(object):
    def __init__(self, name):
        self.name = name
    def __call__(self):
        print('My name is %s.' % self.name)

輸出:
>>> s = Student('Michael')
>>> s()
My name is Michael.
__str__(重新定制打印方式)
class A(object):
    @property
    def name(self):
       return self.__name
    @name.setter
    def name(self,__value):
        self.__name = __value
    def __str__(self):
        return "this is student name is {0}".format(self.__name)
a=A()
a.name="test"
print(a)

輸出如下:
this is student name is test
__iter__(返回迭代對象,用于 for in方法)
__getslice__、__setslice__、__delslice__(切片方法)
閉包(閉包(closure)是函數(shù)式編程的重要的語法結(jié)構(gòu))

閉包構(gòu)成是:一個函數(shù)與他的環(huán)境變量結(jié)合,在Python中,所謂的閉包是一個包含有環(huán)境變量取值的函數(shù)對象。

def line_conf():
    b = 15
    def line(x):
        return 2*x+b
    return line    
my_line = line_conf()
print(my_line(5))       

分析:我們可以看到,line定義的隸屬程序塊中引用了高層級的變量b,但b信息存在于line的定義之外 (b的定義并不在line的隸屬程序塊中)。我們稱b為line的環(huán)境變量。事實上,line作為line_conf的返回值時,line中已經(jīng)包括b的取值(盡管b并不隸屬于line)。

裝飾器

python中一切都是對象,函數(shù)也是對象,因而可以當(dāng)成參數(shù)傳遞。
裝飾模式就是在調(diào)用目標(biāo)函數(shù)之前,對這個函數(shù)隊形進(jìn)行裝飾。
最簡單的裝飾模式如下:

def say_english():
    print("hello")
def greet(say):
    print("英語的你好怎么輸出")
    say()
    print("了解了嗎")
greet(say_english)

greet方法就是把say_English方法修飾。
輸入如下:

英語的你好怎么輸出
hello
了解了嗎

如果把項目上的say_english(),都需要改為這樣格式的輸出,則需要把項目中的say_english()改為greet(say_english)這個方法,這樣子需要大量的工程或者會改漏,為了調(diào)用say_english()也能達(dá)到greet(say_english),則修改如下:

def say_english():
    print("hello")
def greet(say):
    def wrapper():
        print("英語的你好怎么輸出")
        say()
        print("了解了嗎")
    return wrapper
say_english = greet(say_english)
say_english()

python中一切都是對象,那么greet()函數(shù)return的是wrapper的對象。

###語法糖@(python2.4之后才會出現(xiàn))
python中@相當(dāng)于 say_english = greet(say_english) 這句,修改如下:

def greet(say):
    def wrapper():
        print("英語的你好怎么輸出")
        say()
        print("了解了嗎")
    return wrapper

@greet
def say_english():
    print("hello")
say_english()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 兩本不錯的書: 《Python參考手冊》:對Python各個標(biāo)準(zhǔn)模塊,特性介紹的比較詳細(xì)。 《Python核心編程...
    靜熙老師哈哈哈閱讀 3,442評論 0 80
  • 教程地址:python進(jìn)階 - 慕課網(wǎng) python函數(shù)式編程 變量可以指向函數(shù): f = absprint(f)...
    竹口小生閱讀 675評論 0 2
  • 本文為《爬著學(xué)Python》系列第四篇文章。從本篇開始,本專欄在順序更新的基礎(chǔ)上,會有不規(guī)則的更新。 在Pytho...
    SyPy閱讀 2,573評論 4 11
  • 今早兒子八點二十才從家里出發(fā)去補習(xí),第一堂課是英語,兒子不想上,原因是老師喜歡拖堂,布置作業(yè)又多,說班上很多同學(xué)都...
    不忘初心堅持到底閱讀 167評論 -1 3
  • 以前,我每次看見覺得有意思有意義的東西,就想發(fā)朋友圈,自我感覺 因為記錄 因為分享。 然而, 不懂你的人,什么事情...
    妖嬈記閱讀 172評論 0 1

友情鏈接更多精彩內(nèi)容