在Python中访问成员变量为什么要尽量避免通过get或set函数来访问

本文通过对比实验展示了在Python中直接访问类成员变量相较于通过get和set方法访问的性能优势,并提供了具体代码实例及运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://blog.iamzsx.me/show.html?id=183004


熟悉Java的人在学习Python的时候可能会由于写Java代码的习惯,会为class内部的成员变量写一下get和set函数,然后外部通过get和set函数访问,而不是直接访问成员变量。例如,可能会写出下面类似的代码:

 
01 class Test(object):
02  
03      def __init__(self):
04           self.__foo = 0
05      
06      def get_foo(self):
07           return self.__foo
08           
09      def set_foo(self, foo):
10           self.__foo = foo
 
然而,跟Java有所不同( Java中使用get或set函数访问成员变量会影响性能吗?),在Python中通过get和set函数访问与直接访问成员变量的性能差距是很大的。
下面我们来做一个简单的实验(测试版本:Python 2.7)。
 
代码一:使用get和set函数来访问成员变量。
01 import time
02  
03 class Test(object):
04  
05      def __init__(self):
06           self.__foo = 0
07      
08      def get_foo(self):
09           return self.__foo
10           
11      def set_foo(self, foo):
12           self.__foo = foo
13  
14 test = Test()
15 begin = time.time()
16 for in xrange(010000000):
17      test.set_foo(test.get_foo() + * i)
18 print time.time() - begin
运行时间5.8秒左右。
 
代码二:直接访问成员变量
01 import time
02  
03 class Test(object):
04  
05      def __init__(self):
06           self.foo = 0
07  
08 test = Test()
09 begin = time.time()
10 for in xrange(010000000):
11      test.foo = test.foo + * i
12 print time.time() - begin
运行时间3.4秒左右。
 
可以看出直接访问成员变量的性能远高于通过get和set函数访问。
 
因此,如果没有使用get和set函数的必要,就不要使用了。
另外,也要尽量减少Property的使用,这个比通过get和set函数访问的性能还低。
下面的使用Property写的代码的运行时间是6.7秒左右。
01 import time
02  
03 class Test(object):
04  
05      def __init__(self):
06           self.__foo = 0
07      
08      def _get_foo(self):
09           return self.__foo
10           
11      def _set_foo(self, foo):
12           self.__foo = foo
13      
14      foo = property(_get_foo,_set_foo)
15  
16 test = Test()
17 begin = time.time()
18 for i in xrange(010000000):
19      test.foo = test.foo + i * i
20 print time.time() - begin
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值