元類
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()