元類
python中,對(duì)象是由元類創(chuàng)建的易遣,類也是一種對(duì)象彼妻,也就是說元類就是‘類的類’
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) | 如果實(shí)例obj1是類obj2或者obj2子類的一個(gè)實(shí)例牵舵;或者如果obj1 是 obj2 的類型柒啤,則返回 True;反之畸颅,為 False担巩。 |
hasattr(obj, attr) | 如果 obj 有屬性 attr(用字符串給出),返回 True没炒,反之涛癌,返回 |
getattr(obj, attr[, default]) | 獲取 obj 的 attr 屬性;與返回 obj.attr 類似送火;如果 attr 不是 obj 的屬性拳话,如果提供了默認(rèn)值,則返回默認(rèn)值种吸;不然假颇, 就會(huì)引發(fā)一個(gè) 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 的屬性的一個(gè)列表;如果沒有給定 obj哥桥,dir()則顯示局部名字空間空間中的屬性辙浑,也就是 locals().keys() |
super(type, obj=None) | 返回一個(gè)表示父類類型的代理對(duì)象;如果沒有傳入 obj拟糕, 則返 回的 super 對(duì)象是非綁定的判呕;反之,如果 obj 是一個(gè) type 送滞, issubclass(obj,type) 必 為 True 侠草; 否 則 , isinstance(obj,type)就必為 True |
vars(obj=None) | 返回 obj 的屬性及其值的一個(gè)字典犁嗅;如果沒有給出 obj边涕, vars()顯示局部名字空間字典(屬性及其值),也就是 locals()。 |
常用的一些方法實(shí)例
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))
# 判斷是否是實(shí)例或者子類的實(shí)例功蜓。是返回true园爷,不是返回false。
print(isinstance(b,A))
print(hasattr(B,"name"))
定制類
python中有很多有特殊用途的函數(shù)式撼,可用于擴(kuò)充類童社。
實(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 | 運(yùn)行時(shí)的字符串輸出(用于調(diào)試) |
unicode | Unicode 字符串輸出 |
call | 表示可調(diào)用的實(shí)例 |
nonzero | 為object 定義 False 值 旅东;內(nèi)置bool() |
len | “長度”(可用于類)灭抑;內(nèi)建 len() |
cmp | 對(duì)象比較;內(nèi)建 cmp() |
lt | 小于/小于或等于抵代;對(duì)應(yīng)<及<=操作符 |
gt | 大于/大于或等于腾节;對(duì)應(yīng)>及>=操作符 |
eq | 等于/不等于;對(duì)應(yīng)==,!=及<>操作符 |
C.*add(self, obj) | 加荤牍;+操作符 |
C.*sub(self, obj) | 減案腺;-操作符 |
C.*mul(self, obj) | 乘;*操作符 |
C.*div(self, obj) | 除康吵;/操作符 |
新式類的常用法的解釋
__init__ 創(chuàng)建完對(duì)象后調(diào)用劈榨,對(duì)當(dāng)前對(duì)象的實(shí)例的一些初始化
__new__(cls, *args, **kwargs) 創(chuàng)建對(duì)象時(shí)調(diào)用,返回當(dāng)前對(duì)象的一個(gè)實(shí)例晦嵌,只有在新式類的情況下才會(huì)有的方法
new的作用
1同辣、主要是當(dāng)你繼承一些不可變的class時(shí)(比如int, str, tuple), 提供給你一個(gè)自定義這些類的實(shí)例化過程的途徑惭载。還有就是實(shí)現(xiàn)自定義的metaclass
2旱函、因?yàn)轭惷恳淮螌?shí)例化后產(chǎn)生的過程都是通過__new__來控制的,所以通過重載__new__方法描滔,我們 可以很簡單的實(shí)現(xiàn)單例模式棒妨。
class Singleton(object):
def __new__(cls):
# 關(guān)鍵在于這,每一次實(shí)例化的時(shí)候含长,我們都只會(huì)返回這同一個(gè)instance對(duì)象
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__
一個(gè)對(duì)象實(shí)例可以有自己的屬性和方法券腔,當(dāng)我們調(diào)用實(shí)例方法時(shí),我們用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__(返回迭代對(duì)象纷纫,用于 for in方法)
__getslice__、__setslice__田弥、__delslice__(切片方法)
閉包(閉包(closure)是函數(shù)式編程的重要的語法結(jié)構(gòu))
閉包構(gòu)成是:一個(gè)函數(shù)與他的環(huán)境變量結(jié)合涛酗,在Python中,所謂的閉包是一個(gè)包含有環(huán)境變量取值的函數(shù)對(duì)象。
def line_conf():
b = 15
def line(x):
return 2*x+b
return line
my_line = line_conf()
print(my_line(5))
分析:我們可以看到商叹,line定義的隸屬程序塊中引用了高層級(jí)的變量b燕刻,但b信息存在于line的定義之外 (b的定義并不在line的隸屬程序塊中)。我們稱b為line的環(huán)境變量剖笙。事實(shí)上卵洗,line作為line_conf的返回值時(shí),line中已經(jīng)包括b的取值(盡管b并不隸屬于line)弥咪。
裝飾器
python中一切都是對(duì)象过蹂,函數(shù)也是對(duì)象,因而可以當(dāng)成參數(shù)傳遞聚至。
裝飾模式就是在調(diào)用目標(biāo)函數(shù)之前酷勺,對(duì)這個(gè)函數(shù)隊(duì)形進(jìn)行裝飾。
最簡單的裝飾模式如下:
def say_english():
print("hello")
def greet(say):
print("英語的你好怎么輸出")
say()
print("了解了嗎")
greet(say_english)
greet方法就是把say_English方法修飾扳躬。
輸入如下:
英語的你好怎么輸出
hello
了解了嗎
如果把項(xiàng)目上的say_english()脆诉,都需要改為這樣格式的輸出,則需要把項(xiàng)目中的say_english()改為greet(say_english)這個(gè)方法贷币,這樣子需要大量的工程或者會(huì)改漏击胜,為了調(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中一切都是對(duì)象役纹,那么greet()函數(shù)return的是wrapper的對(duì)象偶摔。
###語法糖@(python2.4之后才會(huì)出現(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()