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
|