- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python中关于property使用的小技巧由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
一种用起来像是使用实例属性一样的特殊属性,可以对应于某个方法 。
既要保护类的封装特性,又要让开发者可以使用 对象.属性 的方式操作方法,@property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对 () 小括号.
来看下求圆的面积的例子 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class
Circle(
object
):
PI
=
3.14
def
__init__(
self
, r):
# r圆的半径
self
.r
=
r
self
.__area
=
self
.PI
*
self
.r
*
self
.r
@property
def
area(
self
):
return
self
.__area
def
get_area(
self
):
return
self
.__area
In [
2
]: c
=
Circle(
10
)
In [
3
]: c.area
Out[
3
]:
314.0
In [
4
]: c.get_area()
Out[
4
]:
314.0
|
property属性的定义和调用要注意一下几点:
@property
装饰器;并且仅有一个 self
参数()
1
2
|
实例方法:c.get_area()
property
装饰的方法:c.area
|
对于某商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第 m 条到第 n条的所有数据 这个分页的功能包括:
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
|
class
Pager(
object
):
def
__init__(
self
, current_page):
# 用户当前请求的页码(第一页、第二页...)
self
.current_page
=
current_page
# 每页默认显示10条数据
self
.per_items
=
10
@property
def
start(
self
):
val
=
(
self
.current_page
-
1
)
*
self
.per_items
return
val
@property
def
end(
self
):
val
=
self
.current_page
*
self
.per_items
return
val
# ipython测验
In [
2
]: p
=
Pager(
1
)
In [
3
]: p.start
# 就是起始值,即:m
Out[
3
]:
0
In [
4
]: p.end
# 就是结束值,即:n
Out[
4
]:
10
In [
5
]: p
=
Pager(
2
)
In [
6
]: p.start
Out[
6
]:
10
In [
7
]: p.end
Out[
7
]:
20
|
@property
property
对象的类属性 property()
在类的实例方法上应用 @property 装饰器 。
Python中的类有旧式类 和 新式类,新式类 的属性比 旧式类的属性丰富.
旧式类,具有一种 @property 装饰器 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class
Goods:
def
__init__(
self
, name):
self
.name
=
name
@property
def
price(
self
):
return
100
# ipython测验
In [
10
]: g
=
Goods(
'手表'
)
In [
11
]: g.price
Out[
11
]:
100
|
新式类,具有三种 @property 装饰器 。
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
|
class
Goods:
"""
python3中默认继承object类
以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter @xxx.deleter
"""
@property
def
price(
self
):
print
(
'@property'
)
@price
.setter
def
price(
self
, value):
print
(
'@price.setter'
)
@price
.deleter
def
price(
self
):
print
(
'@price.deleter'
)
# ipython测验
In [
13
]: g
=
Goods()
In [
14
]: g.price
@property
In [
15
]: g.price
=
100
@price
.setter
In [
16
]:
del
g.price
@price
.deleter
|
g.price
单独调用自动执行 @property
修饰的 price
方法,并获取方法的返回值g.price = 100
赋值自动执行 @price.setter
修饰的 price
方法,并将 100
赋值给方法的参数del g.price
删除自动执行 @price.deleter
修饰的 price
方法注意 。
@property
修饰的方法@property
、@方法名.setter
、@方法名.deleter
修饰的方法由于新式类中具有三种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除.
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
51
52
53
54
55
|
# Goods类@property应用
class
Goods(
object
):
def
__init__(
self
, name, price):
# 原价
self
.original_price
=
price
# 折扣
self
.discount
=
0.8
@property
def
price(
self
):
# 实际价格 = 原价 * 折扣
new_price
=
self
.original_price
*
self
.discount
return
new_price
@price
.setter
def
price(
self
, value):
self
.original_price
=
value
@price
.deleter
def
price(
self
):
print
(
'删除商品原价'
)
del
self
.original_price
# ipython测验
In [
22
]: g
=
Goods(
'小米手机'
,
2000
)
In [
23
]: g.price
Out[
23
]:
1600.0
In [
24
]: g.price
=
3000
In [
25
]: g.price
Out[
25
]:
2400.0
In [
26
]:
del
g.price
删除商品原价
In [
27
]: g.price
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
AttributeError Traceback (most recent call last)
<ipython
-
input
-
27
-
38ee45b469f2
>
in
<module>
-
-
-
-
>
1
g.price
<ipython
-
input
-
18
-
d5ea66eb7ece>
in
price(
self
)
12
def
price(
self
):
13
# 实际价格 = 原价 * 折扣
-
-
-
>
14
new_price
=
self
.original_price
*
self
.discount
15
return
new_price
16
AttributeError:
'Goods'
object
has no attribute
'original_price'
|
创建值为 property 对象的类属性,当使用类属性的方式创建 property 属性时,旧式类 和 新式类无区别 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class
Foo:
def
get_bar(
self
):
return
'get_bar'
BAR
=
property
(get_bar)
# ipython 测验
In [
32
]: f
=
Foo()
In [
33
]: f.BAR
Out[
33
]:
'get_bar'
|
f.BAR 自动调用 get_bar() 方法,并获取方法的返回值 。
property() 中有个四个参数 。
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
|
class
Foo(
object
):
def
__init__(
self
, bar):
self
.bar
=
bar
def
get_bar(
self
):
print
(
'get_bar'
)
return
self
.bar
def
set_bar(
self
, value):
"""必须要有两个参数"""
print
(
'set bar '
+
value)
self
.bar
=
value
def
del_bar(
self
):
print
(
'del bar'
)
del
self
.bar
BAR
=
property
(get_bar, set_bar, del_bar,
"bar description..."
)
# ipython测验
In [
50
]: f
=
Foo(
'python'
)
In [
51
]: f.BAR
get_bar
Out[
51
]:
'python'
In [
52
]: f.BAR
=
'Java'
set
bar Java
In [
53
]: f.BAR
get_bar
Out[
53
]:
'Java'
In [
54
]:
del
f.BAR
del
bar
|
由于 类属性方式 创建 property 对象属性具有3种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对 同一个属性:获取、修改、删除 ,跟 @property 装饰器对比.
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
|
# Goods类 property对象类属性 应用
class
Goods(
object
):
def
__init__(
self
, name, price):
# 原价
self
.original_price
=
price
# 折扣
self
.discount
=
0.8
def
get_price(
self
):
# 实际价格 = 原价 * 折扣
new_price
=
self
.original_price
*
self
.discount
return
new_price
def
set_price(
self
, value):
self
.original_price
=
value
def
del_price(
self
):
print
(
'删除商品原价'
)
del
self
.original_price
PRICE
=
property
(get_price, set_price, del_price,
"price description"
)
# ipython测验
In [
59
]: g
=
Goods(
'Mac电脑'
,
9000
)
In [
60
]: g.PRICE
Out[
60
]:
7200.0
In [
61
]: g.PRICE
=
10000
In [
62
]: g.PRICE
Out[
62
]:
8000.0
In [
63
]:
del
g.PRICE
删除商品原价
|
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
|
# Goods类 @property装饰器 应用
class
Goods(
object
):
def
__init__(
self
, name, price):
# 原价
self
.original_price
=
price
# 折扣
self
.discount
=
0.8
@property
def
price(
self
):
# 实际价格 = 原价 * 折扣
new_price
=
self
.original_price
*
self
.discount
return
new_price
@price
.setter
def
price(
self
, value):
self
.original_price
=
value
@price
.deleter
def
price(
self
):
print
(
'删除商品原价'
)
del
self
.original_price
# ipython测验
In [
59
]: g
=
Goods(
'Mac电脑'
,
9000
)
In [
60
]: g.PRICE
Out[
60
]:
7200.0
In [
61
]: g.PRICE
=
10000
In [
62
]: g.PRICE
Out[
62
]:
8000.0
In [
63
]:
del
g.PRICE
删除商品原价
|
可以发现两种都可以实现但 @property 装饰器的在 旧式类中只有 @property , 没有@method.setter 和@method.deleter,新式类则两种都可以使用。因此看大家的习惯,选一种.
大自然用数百亿年创造出我们现实世界,而程序员用几百年创造出一个完全不同的虚拟世界。我们用键盘敲出一砖一瓦,用大脑构建一切。人们把1000视为权威,我们反其道行之,捍卫1024的地位。我们不是键盘侠,我们只是平凡世界中不凡的缔造者 .
到此这篇关于Python中关于property使用的小技巧的文章就介绍到这了,更多相关Python property 内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/qq_43629857/article/details/115322753 。
最后此篇关于Python中关于property使用的小技巧的文章就讲到这里了,如果你想了解更多关于Python中关于property使用的小技巧的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
您好,下面是我在 AWS 中创建启用了弹性 IP 的实例的模板。但是我不确定我哪里出错了。我已经通过在线 json 验证器验证了 json,仍然面临问题请帮忙 { "AWSTemplateForm
标题有点乱,但已经说明了一切。我想在一个属性的属性上有一个属性观察器: class A { var b: B init() { b = B() } fu
假设我的一个 Controller 中有这样的方法: [Route("api/Products")] public IQueryable GetProducts() { return db.P
这有效: // @flow import React, {Component} from 'react'; type Props = {}; class Delete extends Componen
我有一个 ViewModelBase 类,我在其中为 INotifyPropertyChanged 接口(interface)定义了 RaisePropertyChanged 方法。大多数 MVVM
我创建了类: class StorageBase { public Queue Slices {get;set;} } 和 wpf 自定义控件,它具有 StorageBase 类型的依赖属性
我的 java 应用程序问题是 log4j2 系统日志不是写在 'local1.log' 中而是'消息'。我的/etc/rsyslog.conf 在/etc/rsyslog.conf 中配置为 'lo
为什么需要在对象中使用 this.property = property ?它是用来定义对象的“外部世界”的属性吗? function Person(property) { this.property
摘要: 这个问题是关于属性的继承与从彼此继承属性的类的内部和外部的不同读/写访问相结合。 详细信息: 我有一个类 A 和另一个继承自 A 的类 B。 A 中声明了属性someProperty。我希望该
我正在开发 ASP.NET MVC 应用,设计域模型,使用(测试)新的 EF Code First 功能。 我有一个可能有也可能没有截止日期的事件实体,处理它的最佳方法是什么? 1 个属性: publ
我在配置项目时经常使用它们,但大多数情况下都是按照指示添加 fragment 。我完全不知道哪个文件到底是做什么的。谁能清楚地说明每个文件的用途。 到目前为止我认为 local.properties
在运行 python 文件以使用 rasa nlu 训练文件时,我在命令提示符下收到此错误 我目前正在使用 Windows 10 rasa_core==0.8.2 rasa_nlu==0.11.4 p
我在这方面遇到了一些麻烦,尽管我已经搜索了答案,但还是找不到。 为了使用 AsyncAppender,我看到了很多不同的 log4j 配置,无论如何,它们都与 .properties 配置文件无关。
我正在编写一个 Python 类,并使用 @property 装饰器为该类创建属性。 我在文档中没有找到太多关于这个装饰器的信息,但是从我可以从 Stack Overflow 和我的 Python l
在 gradle 任务中,我可以创建这样的路径: System.env.FOLDER_PATH + '/subFolder' 但我想在我的 gradle.properties 中设置它,所以它会像 s
如何在属性文件的 log4j2 中创建键值对? 我知道在 log4j 版本 1 中它是这样完成的: log4j.appender.x.additionalFields={'key': 'value'}
我想通了 struct PropertyTest { @property int x() { return val; } @property void x( int newVal )
我有 REST (Jersey) webservice,它利用了一些编码/解码到/来自 XML 的数据对象。数据对象位于 webservice war 所依赖的单独项目/jar 中。 我使用 MOXy
我正在创建一个 LinkedList 类: function LinkedList(){ ... 有什么区别: this.addNode = function(data){
关于语义的快速问题:) 如果我正在编写一个协议(protocol),这是首选: // (a) @protocol MyProtocol @property (nonatomic, copy) NSSe
我是一名优秀的程序员,十分优秀!