Python 屬性和property內建函式

2021-06-22 20:49:04 字數 3009 閱讀 8804

早期的python版本中,我們一般用__getattr__()和__setattr__()來處理和屬性相關的問題。屬性的訪問會涉及以上的方法(和__getattribute__()),但是如果用property()來處理這些問題,就可以寫乙個和屬性有關的屬性來處理例項屬性的獲取(getting)、賦值(setting)和刪除(deleting)操作,就不必在使用那些特殊的方法了。

property()內建函式的四個引數,它們是:

property(fget=none, fset=none, fdel=none, doc=none)

實際上,property()是在它所在的類被建立時呼叫的,這些傳進來的(作為引數的)方法是非繫結的,所以這些方法就是函式!

例項一:

class protectandhidex(object):

def __init__(self,x):

assert isinstance(x,int),\

'"x" must be an integer!'

self.__x = ~x

def get_x(self):

return ~self.__x

x = property(get_x)

inst = protectandhidex(10)

print "inst.x = ",inst.x

inst.x = 20

inst.x =  10

:

attributeerror: can't set attribute

例項二:

class hidex(object):

def __init__(self,x):

self.x = x

def get_x(self):

return ~self.__x

def set_x(self,x):

assert isinstance(x,int),\

'"x" must be an integer!'

self.__x = ~x

x = property(get_x, set_x)

inst2 = hidex(10)

print inst2.x

inst2.x = 20

print inst2.x

10

20例項三:

from math import pi

def get_pi(dummy):

return pi

class pi(object):

pi = property(get_pi,doc = 'constant "pi"')

inst3 = pi()

print inst3.pi

print pi.pi.__doc__

3.14159265359

constant "pi"

例項四:

class hidexx(object):

def __init__(self, x):

self.x = x

@property

def x():

def fget(self):

return ~self.__x

def fset(self,x):

assert isinstance(x,int),\

'"x" must be an integer!'

self.__x = ~x

return locals()

inst4 = hidexx(20)

print inst4.x

inst4.x = 40

print inst4.x

:

attributeerror: can't set attribute(至於為什麼,還沒搞明白,新式類繼承自object反而不可以)

修改上述**:

class hidexx:

def __init__(self, x):

self.x = x

@property

def x():

def fget(self):

return ~self.__x

def fset(self,x):

assert isinstance(x,int),\

'"x" must be an integer!'

self.__x = ~x

return locals()

inst4 = hidexx(20)

print inst4.x

inst4.x = 40

print inst4.x

20

40例項五:

class student(object):

@property

def score(self):

return self._score

@score.setter

def score(self, value):

if not isinstance(value, int):

raise valueerror('score must be an integer!')

if value < 0 or value > 100:

raise valueerror('score must between 0 ~ 100!')

self._score = value

stu = student()

stu.score = 20

print stu.score

20

ref:core python programming

一文帶你搞懂python中的property

通常我們在獲得變數的一些私有屬性時,必須通過方法來獲取私有屬性,並不能直接訪問 修改其數值的時候也是要通過方法去修改,這樣非常的不方便 所以python提供了一種方式,將呼叫方法的的形式轉變為訪問屬性,這樣使用非常方便 class student def init self 這是乙個私有屬性 sel...

Python 類屬性和例項屬性

一 簡述二者區別 對類屬性的修改可被儲存在類中 單例模式就是基於類屬性的這種特性 修改後的屬性能夠被子類繼承 例項屬性的修改只對該例項有效,不會對其他例項和其對應類的子類例項造成影響 二 來看下例子 類屬性 class a object a 1 pass print a.a 檢視a類的屬性a,結果為...

python 例項屬性和類屬性

如何在乙個類中定義一些常量,每個物件都可以方便訪問這些常量而不用重新構造?第乙個問題,在 python 的類裡,你只需要和函式並列地宣告並賦值,就可以實現這一點,例如這段 中的 welcome str。一種很常規的做法,是用全大寫來表示常量,因此我們可以在類中使用 self.welcome str ...