python 类属性装饰器

  

property装饰器:

后面跟的函数名就是以后的属性,它即是getter,这个必须有,只读属性

setter装饰器:

于属性名同名,接收两个参数,第一个是self,第二个是将要赋值的值,将属性变为可写

deleter装饰器:

可以控制属性是否删除

 

property装饰器必须在前,setter,deleter在后

property装饰器通过简单的方式,把对方法的访问变成对属性的访问,并起到一定的隐藏效果

复制代码
class Person:
    def __init__(self, name, age=18):
        self.name = name
        self._age = age

    def getage(self):
        return self._age

    def setage(self, age):
        self._age = age

tom=Person('tom')
print(tom.getage())
tom.setage(88)
print(tom.getage())
复制代码

 

 

复制代码
class Person:
    def __init__(self,name,age=18):
        self.name=name
        self.__age=age

    def getage(self):
        return self.__age

    def setage(self,value):
        self.__age=value

biz=Person('biz')
print(biz.getage())
biz.setage(99)
print(biz.getage())
复制代码

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# import re
# p='''bottle\r\nbag\r\nbig\napple'''
#
# regex=re.compile('(b\w+)')
# # b=regex.match(p)
# # print(b.groups(),b.group(),p[b.start():b.end()])
# # b=regex.search(p,1)
# # print(b.groups())
# regex=re.compile(r'(b\w+)\r\n(?P<name1>b\w+)\r\n(?P<name2>b\w+)')
# # b=regex.match(p)
# # print(b)
# # print(b.groups(),b.group(0),b.group(1),b.group(2),b.group(3))
# # print(b.groupdict())
# # print(b.groupdict()['name1'])
# # print(b.groupdict()['name2'])
# # b=regex.findall(p)
# # print(b)
# # for m in b[0]:
# #     print(type(m),m)
# regex=re.compile('(?P<head>b\w+)')
# b=regex.finditer(p)
# for m in b:
#     print(type(m),m,m.group(),m.group('head'),m.groupdict()['head'])
#
# s='''os.path([path])  sub-path'''
# print(re.split('[^-\w]+',s))
class Person:
    def __init__(self,name,age=18):
        self.name=name
        self.__age=age
 
    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self,value):
        self.__age=value
    @age.deleter
    def age(self):
        del self.__age
 
biz=Person('biz')
print(biz.age)
biz.age=89
print(biz.age)
print(biz.__dict__)
print(dir(biz))
del biz.age
print(biz.__dict__)
print(dir(biz))

  #### Notice:这三个方法同名

 

复制代码
class Person:
    def __init__(self,name,age=18):
        self.name=name
        self.__age=age

    def getage(self):
        return self.__age

    def setage(self,value):
        self.__age=value

    def delage(self):
        del self.__age

    age=property(getage,setage,delage)

ciz=Person('ciz')
print(ciz.age)
ciz.age=77
print(ciz.age)
del ciz.age
print(ciz.__dict__)
复制代码

 

 

复制代码
class Person:
    def __init__(self,name,age=18):
        self.name=name
        self.__age=age
    
    age=property(lambda self:self.__age)
复制代码

 

复制代码
class Biv:
    def __init__(self,chinese,english,history):
        self._c=chinese
        self._e=english
        self.__h=history
    def geth(self):
        return self.__h
    def seth(self,value):
        self.__h=value
    def gete(self):
        return self._e
    @property
    def chinese(self):
        return self._c
    @chinese.setter
    def chinese(self,value):
        self._c=value
    @chinese.deleter
    def chinese(self):
        del self._c
    # hh=property(geth,seth)
    hh=property(lambda self:self.__h,lambda self,value:exec("self._Biv__h=value"))
    print(type(hh), hh)

p=Biv(4,5,6)
p.hh=444
print(type(p.hh),p.hh)

# print(p.geth())
# p.seth(88)
# print(p.geth())
# print(p.chinese)
# p._c=999
# print(p.chinese)
# p.chinese=888
# print(p.chinese)
print(p.chinese)
# del p.chinese
# del p._c
print(p.chinese)
复制代码

 

posted @   ascertain  阅读(815)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示