真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

關(guān)于python函數(shù)是數(shù)據(jù)嗎的信息

python 函數(shù)是不是描述符

在Python中,訪問(wèn)一個(gè)屬性的優(yōu)先級(jí)順序按照如下順序:

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、徐水網(wǎng)站維護(hù)、網(wǎng)站推廣。

1.類屬性

2.數(shù)據(jù)描述符

3.實(shí)例屬性

4.非數(shù)據(jù)描述符

5.__getattr__()方法。這個(gè)方法的完整定義如下所示:

[python] view plain copy

def __getattr__(self,attr) :#attr是self的一個(gè)屬性名

pass;

先來(lái)闡述下什么叫數(shù)據(jù)描述符。

數(shù)據(jù)描述符是指實(shí)現(xiàn)了__get__,__set__,__del__方法的類屬性(由于Python中,一切皆是對(duì)象,所以你不妨把所有的屬性也看成是對(duì)象)

PS:個(gè)人覺得這里最好把數(shù)據(jù)描述符等效于定義了__get__,__set__,__del__三個(gè)方法的接口。

闡述下這三個(gè)方法:

__get__的標(biāo)準(zhǔn)定義是__get__(self,obj,type=None),它非常接近于JavaBean的get

第一個(gè)函數(shù)是調(diào)用它的實(shí)例,obj是指去訪問(wèn)屬性所在的方法,最后一個(gè)type是一個(gè)可選參數(shù),通常為None(這個(gè)有待于進(jìn)一步的研究)

例如給定類X和實(shí)例x,調(diào)用x.foo,等效于調(diào)用:

type(x).__dict__["foo"].__get__(x,type(x))

調(diào)用X.foo,等效于調(diào)用:

type(x).__dict__["foo"].__get__(None,type(x))

第二個(gè)函數(shù)__set__的標(biāo)準(zhǔn)定義是__set__(self,obj,val),它非常接近于JavaBean的set方法,其中最后一個(gè)參數(shù)是要賦予的值

第三個(gè)函數(shù)__del__的標(biāo)準(zhǔn)定義是__del__(self,obj),它非常接近Java中Object的Finailize()方法,指

Python在回收這個(gè)垃圾對(duì)象時(shí)所調(diào)用到的析構(gòu)函數(shù),只是這個(gè)函數(shù)永遠(yuǎn)不會(huì)拋出異常。因?yàn)檫@個(gè)對(duì)象已經(jīng)沒(méi)有引用指向它,拋出異常沒(méi)有任何意義。

接下來(lái),我們來(lái)一一比較這些優(yōu)先級(jí).

首先來(lái)看類屬性

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class A(object):

foo=3

print A.foo

a=A()

print a.foo

a.foo=4

print a.foo

print A.foo

上面這段代碼的輸出如下:

3

3

4

3

從輸出可以看到,當(dāng)我們給a.foo賦值的時(shí)候,其實(shí)與類實(shí)例的那個(gè)foo是沒(méi)有關(guān)系的。a.foo=4 這句話給a對(duì)象增加了一個(gè)屬性叫foo。其值是4。

最后兩個(gè)語(yǔ)句明確的表明了,我們輸出a.foo和A.foo的值,他們是不同的。

但是為什么a=A()語(yǔ)句后面的print

a.foo輸出了3呢?這是因?yàn)楦鶕?jù)搜索順序找到了類屬性。當(dāng)我們執(zhí)行a.foo=4的時(shí)候,我們讓a對(duì)象的foo屬性指向了4這個(gè)對(duì)象。但是并沒(méi)有改變

類屬性foo的值。所以最后我們print A.foo的時(shí)候,又輸出了3。

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class A(object):

foo=3

a=A()

a.foo=4

print a.foo

del a.foo

print a.foo

上面的代碼,我給a.foo賦值為4,在輸出一次之后就del了。兩次輸出,第一次輸出的是a對(duì)象的屬性。第二次是類屬性。不是說(shuō)類屬性的優(yōu)先級(jí)比

實(shí)例屬性的高嗎。為啥第一次輸出的是4而不是3呢?還是上面解釋的原因。因?yàn)閍.foo與類屬性的foo只是重名而已。我們print

a.foo的時(shí)候,a的foo指向的是4,所以輸出了4。

------------------------------------

然后我們來(lái)看下數(shù)據(jù)描述符這一全新的語(yǔ)言概念。按照之前的定義,一個(gè)實(shí)現(xiàn)了__get__,__set__,__del__的類都統(tǒng)稱為數(shù)據(jù)描述符。我們來(lái)看下一個(gè)簡(jiǎn)單的例子。

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __get__(self,obj,type=None):

pass

def __set__(self,obj,val):

pass

def __del__(self,obj):

pass

class A(object):

foo=simpleDescriptor()

print str(A.__dict__)

print A.foo

a=A()

print a.foo

a.foo=13

print a.foo

上面例子的輸出結(jié)果如下:

[plain] view plain copy

{'__dict__': attribute '__dict__' of 'A' objects, '__module__': '__main__', 'foo': __main__.simpleDescriptor object at 0x005511B0, '__weakref__': attribute '__weakref__' of 'A' objects, '__doc__': None}

None

None

None

從輸出結(jié)果看出,print語(yǔ)句打印出來(lái)的都是None。這說(shuō)明a.foo都沒(méi)有被賦值內(nèi)容。這是因?yàn)開_get__函數(shù)的函數(shù)體什么工作都沒(méi)有做。直接是pass。此時(shí),想要訪問(wèn)foo,每次都沒(méi)有返回內(nèi)容,所以輸出的內(nèi)容就是None了。

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __get__(self,obj,type=None):

return "hi there"

def __set__(self,obj,val):

pass

def __del__(self,obj):

pass

class A(object):

foo=simpleDescriptor()

print str(A.__dict__)

print A.foo

a=A()

print a.foo

a.foo=13

print a.foo

把__get__函數(shù)實(shí)現(xiàn)以下,就可以得到如下輸出結(jié)果:

[plain] view plain copy

{'__dict__': attribute '__dict__' of 'A' objects, '__module__': '__main__', 'foo': __main__.simpleDescriptor object at 0x00671190, '__weakref__': attribute '__weakref__' of 'A' objects, '__doc__': None}

hi there

hi there

hi there

為了加深對(duì)數(shù)據(jù)描述符的理解,看如下例子:

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __init__(self):

self.result = None;

def __get__(self, obj, type=None) :

return self.result - 10;

def __set__(self, obj, val):

self.result = val + 3;

print self.result;

def __del__(self, obj):

pass

class A(object):

foo = simpleDescriptor();

a = A();

a.foo = 13;

print a.foo;

上面代碼的輸出是

16

6

第一個(gè)16為我們?cè)趯?duì)a.foo賦值的時(shí)候,人為的將13加上3后作為foo的值,第二個(gè)6是我們?cè)诜祷豠.foo之前人為的將它減去了10。

所以我們可以猜測(cè),常規(guī)的Python類在定義get,set方法的時(shí)候,如果無(wú)特殊需求,直接給對(duì)應(yīng)的屬性賦值或直接返回該屬性值。如果自己定義類,并且繼承object類的話,這幾個(gè)方法都不用定義。

-----------------

在這里看一個(gè)題外話。

看代碼

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __init__(self):

self.result = None;

def __get__(self, obj, type=None) :

return self.result - 10;

def __set__(self, obj, val):

if isinstance(val,str):

assert False,"int needed! but get str"

self.result = val + 3;

print self.result;

def __del__(self, obj):

pass

class A(object):

foo = simpleDescriptor();

a = A();

a.foo = "13";

print a.foo;

上面代碼在__set__ 函數(shù)中檢查了參數(shù)val,如果val是str類型的,那么要報(bào)錯(cuò)。這就實(shí)現(xiàn)了我們上一篇文章中要實(shí)現(xiàn)的,在給屬性賦值的時(shí)候做類型檢查的功能。

-----------------------------------------------

下面我們來(lái)看下實(shí)例屬性和非數(shù)據(jù)描述符。

[python] view plain copy

# -*- coding:utf-8 -*-

'''''

Created on 2013-3-29

@author: naughty

'''

class B(object):

foo = 1.3

b = B()

print b.__dict__

b.bar = 13

print b.__dict__

print b.bar

上面代碼輸出結(jié)果如下:

{}

{'bar': 13}

13

那么什么是非數(shù)據(jù)描述符呢?

簡(jiǎn)單的說(shuō),就是沒(méi)有實(shí)現(xiàn)get,set,del三個(gè)方法的所有類。

讓我們?nèi)我饪匆粋€(gè)函數(shù)的描述:

def call():

pass

執(zhí)行print dir(call)會(huì)得到如下結(jié)果:

[plain] view plain copy

['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']

先看下dir的幫助。

dir列出給定對(duì)象的屬性或者是從這個(gè)對(duì)象能夠達(dá)到的對(duì)象。

回到print dir(call)方法的輸出,看到,call方法,有輸出的那么多個(gè)屬性。其中就包含了__get__函數(shù)。但是卻沒(méi)有__set__和__del__函數(shù)。所以所有的類成員函數(shù)都是非數(shù)據(jù)描述符。

看一個(gè)實(shí)例數(shù)據(jù)掩蓋非數(shù)據(jù)描述符的例子:

[python] view plain copy

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __get__(self,obj,type=None) :

return "get",self,obj,type

class D(object):

foo=simpleDescriptor()

d=D()

print d.foo

d.foo=15

print d.foo

看輸出:

('get', __main__.simpleDescriptor object at 0x02141190,

__main__.D object at 0x025CAF50, class '__main__.D')

15

可見,實(shí)例數(shù)據(jù)掩蓋了非數(shù)據(jù)描述符。

如果改成數(shù)據(jù)描述符,那么就不會(huì)被覆蓋了??聪旅妫?/p>

[python] view plain copy

'''''

Created on 2013-3-29

@author: naughty

'''

class simpleDescriptor(object):

def __get__(self,obj,type=None) :

return "get",self,obj,type

def __set__(self,obj,type=None) :

pass

def __del__(self,obj,type=None) :

pass

class D(object):

foo=simpleDescriptor()

d=D()

print d.foo

d.foo=15

print d.foo

代碼的輸出如下:

[plain] view plain copy

('get', __main__.simpleDescriptor object at 0x01DD1190, __main__.D object at 0x0257AF50, class '__main__.D')

('get', __main__.simpleDescriptor object at 0x01DD1190, __main__.D object at 0x0257AF50, class '__main__.D')

由于是數(shù)據(jù)描述符,__set __函數(shù)體是pass,所以兩次輸出都是同樣的內(nèi)容。

最后看下__getatrr__方法。它的標(biāo)準(zhǔn)定義是:__getattr__(self,attr),其中attr是屬性名

python類和函數(shù)的區(qū)別

類,class,用來(lái)描述具有相同的屬性和方法的對(duì)象的集合。它定義了該集合中每個(gè)對(duì)象所共有的屬性和方法。對(duì)象是類的實(shí)例。

函數(shù),是組織好的,可重復(fù)使用的,用來(lái)實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段。

函數(shù)能提高應(yīng)用的模塊性,和代碼的重復(fù)利用率。你已經(jīng)知道python提供了許多內(nèi)建函數(shù),比如print()。但你也可以自己創(chuàng)建函數(shù),這被叫作用戶自定義函數(shù)。

python語(yǔ)言中類和函數(shù)的區(qū)別

1、規(guī)則不同

類是一種引用數(shù)據(jù)類型,類似于byte、short、int(char)、long、float、double等基本數(shù)據(jù)類型;

函數(shù)必須聲明后才可以被調(diào)用,調(diào)用格式為:函數(shù)名(實(shí)參)調(diào)用時(shí)函數(shù)名后的小括號(hào)中的實(shí)參必須和聲明函數(shù)時(shí)的函數(shù)括號(hào)中的形參個(gè)數(shù)相同。

2、主體不同

類是面向?qū)ο蟪绦蛟O(shè)計(jì)實(shí)現(xiàn)信息封裝的基礎(chǔ);

函數(shù)是指一段在一起的、可以做某一件事的子程序。

3、特點(diǎn)不同

類是一種用戶定義的引用數(shù)據(jù)類型,也稱類類型,每個(gè)類包含數(shù)據(jù)說(shuō)明和一組操作數(shù)據(jù)或者傳遞消息的函數(shù),類的實(shí)例稱為對(duì)象;

函數(shù)分為全局函數(shù)、全局靜態(tài)函數(shù),在類中還可以定義構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、成員函數(shù)、友元函數(shù)、運(yùn)算符重載函數(shù)、內(nèi)聯(lián)函數(shù)等。

python中視圖函數(shù)傳值的數(shù)據(jù)類型可以傳對(duì)象嗎

python的一切數(shù)據(jù)類型都是對(duì)象。但是python的對(duì)象分為不可變對(duì)象和可變對(duì)象。python的變量是引用,對(duì)python變量的賦值是引用去綁定該對(duì)象。

可變對(duì)象的數(shù)據(jù)發(fā)生改變,例如列表和字典,引用不會(huì)更改綁定對(duì)象,畢竟本身就是用于增刪改查的,頻繁地產(chǎn)生新對(duì)象必然導(dǎo)致開銷巨大,只需要該對(duì)象內(nèi)部變化就行;但對(duì)于綁定了不可變對(duì)象的引用,對(duì)象一旦改變就會(huì)使引用綁定新的對(duì)象。

這一點(diǎn)也會(huì)反應(yīng)到函數(shù)的參數(shù)上。python的傳值方式是“傳對(duì)象”引用。python的函數(shù),形參實(shí)際上是引用,實(shí)參便是對(duì)象綁定到該引用上。本質(zhì)是形參會(huì)被作為函數(shù)的局部變量,在開辟的函數(shù)的棧內(nèi)存中被聲明。

簡(jiǎn)要來(lái)講:

如果參數(shù)是數(shù),則類似值傳遞,

如果參數(shù)是列表和字典,則類似引用傳遞。

每個(gè)對(duì)象都會(huì)有個(gè)id, 可以用id()驗(yàn)證以上說(shuō)法:

這個(gè)函數(shù)的參數(shù)是列表,是可變對(duì)象。


當(dāng)前文章:關(guān)于python函數(shù)是數(shù)據(jù)嗎的信息
標(biāo)題來(lái)源:http://weahome.cn/article/doippgh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部