class Foo:
def __init__(self):
self.name = 'a'
# obj.bar()
def bar(self):
# self是對象
print('bar')
@property
def per(self):
print('123')
return 1
obj = Foo()
r = obj.per # 123 在定義時像方法,在訪問時像字段
print(r) # 1
如果在per中只有一條語句return 1,那麼per就是一個屬性。
class Foo:
def __init__(self):
self.name = 'a'
# obj.bar()
def bar(self):
# self是對象
print('bar')
@property
def per(self):
return 1
obj = Foo()
r = obj.per # 123 在定義時像方法,在訪問時像字段
print(r) # 1
如果想要給obj.per賦值,需要增加一個函數。(如果直接obj.per=123,會報錯AttributeError: can't set attribute)
class Foo:
def __init__(self):
self.name = 'a'
# obj.bar()
def bar(self):
# self是對象
print('bar')
# 用於執行obj.per
@property
def per(self):
return 1
# 用於執行obj.per = 123
@per.setter
def per(self, val):
print(val)
@per.deleter
def per(self):
print('666')
obj = Foo()
r = obj.per # 123 在定義時像方法,在訪問時像字段
print(r) # 1
obj.per = 123 # 123
del obj.per
del obj.per並不是真正地刪除了obj.per,該語句所做的是在@per.deleter裏對應的代碼。正如上述代碼中的del obj.per所做的就是打印了666。
舉個栗子:
li = []
for i in range(1000):
li.append(i)
while True:
p = input('請輸入要查看的頁碼:')
p = int(p)
start = (p-1)*10
end = p*10
print(li[start:end])
這是沒用屬性的代碼,只用了方法
class Pergination:
def __init__(self, current_page):
try:
self.page = int(current_page)
except Exception as e:
self.page = 1
def start(self):
return (self.page-1)*10
def end(self):
return self.page*10
li = []
for i in range(1000):
li.append(i)
while True:
p = input('請輸入要查看的頁碼:')
obj = Pergination(p)
print(li[obj.start():obj.end()])
用了屬性的代碼(屬性的作用就是爲了去掉調用時的括號)
class Pergination:
def __init__(self, current_page):
try:
self.page = int(current_page)
except Exception as e:
self.page = 1
@property
def start(self):
return (self.page-1)*10
@property
def end(self):
return self.page*10
li = []
for i in range(1000):
li.append(i)
while True:
p = input('請輸入要查看的頁碼:')
obj = Pergination(p)
print(li[obj.start:obj.end])
屬性的另一種表達方式
class Foo:
def f1(self):
return 123
def f2(self, v):
print(v)
def f3(self):
print('del')
per = property(fget=f1, fset=f2, fdel=f3)
# 上述代碼等價於
# @property
# def per(self):
# return 123
obj = Foo()
ret = obj.per
print(ret)
obj.per = 123456
del obj.per
# 123
# 123456
# del