Python3/Classes/OOP/如何使用方法更改对象自身值?
我正在学习python如何像计算机科学家一样思考:学习python 3 我正在学习OOP,并编写了一些代码来回答书中的一个问题,但我觉得我应该做些别的事情 所讨论的代码是Python3/Classes/OOP/如何使用方法更改对象自身值?,python,oop,class,python-3.x,Python,Oop,Class,Python 3.x,我正在学习python如何像计算机科学家一样思考:学习python 3 我正在学习OOP,并编写了一些代码来回答书中的一个问题,但我觉得我应该做些别的事情 所讨论的代码是incremental(),其目标是增加对象的值。现在,我的最终解决方案是将我的方法复制为初始值设定方法,并在那里添加时间 这感觉很马虎: class MyTime: 定义初始(自我,小时=0,分钟=0,秒=0,): “”“创建一个初始化为小时、分钟、秒的新MyTime对象。 分和秒的值可能超出范围0-59, 但是结果MyTim
incremental()
,其目标是增加对象的值。现在,我的最终解决方案是将我的方法复制为初始值设定方法,并在那里添加时间
这感觉很马虎:
class MyTime:
定义初始(自我,小时=0,分钟=0,秒=0,):
“”“创建一个初始化为小时、分钟、秒的新MyTime对象。
分和秒的值可能超出范围0-59,
但是结果MyTime对象将被规范化。
"""
#计算要表示的总秒数
总秒=小时*3600+分钟*60+秒
self.hours=totalsecs//3600#分为h、m、s
剩余秒数=总秒数%3600
self.minutes=剩饭剩菜秒//60
self.seconds=剩余的秒数%60
def激励(自身,t):
#增加时间t个数量
totalsecs=self.hours*3600+self.minutes*60+self.seconds+t
self.hours=totalsecs//3600#分为h、m、s
剩余秒数=总秒数%3600
self.minutes=剩饭剩菜秒//60
self.seconds=剩余的秒数%60
t1=我的时间(5,5,5)
t2=我的时间(10,10,10)
t3=我的时间(12,12,12)
打印('before:',t1)
t1.激励(100)
打印('after:',t1)
那怎么样?有没有办法清理一下 主要的变化是您应该在
中使用incerment
,因为您的init包含基本相同的代码。您可以尝试这样做
# calculate total seconds to represent
self.totalsecs = hrs*3600 + mins*60 + secs
self.set_times()
def incerment(self, t):
# increase the time by t amount
self.totalsecs = self.hours * 3600 + self.minutes * 60 + self.seconds + t
self.set_times()
def set_times(self):
self.hours = self.totalsecs // 3600 # split in h, m, s
leftoversecs = self.totalsecs % 3600
self.minutes = leftoversecs // 60
self.seconds = leftoversecs % 60
那种感觉好像你应该做些别的事情,因为小时
,分钟
,秒
是属性
您并不需要将这些值存储为对象的属性,您只需要能够在需要时访问这些值
比如说:
>>> t1.hours
5
因此,让我们使用以下方法重写您的示例:
class MyTime:
定义初始值(自身,小时=0,分钟=0,秒=0):
self.totalsecs=小时*3600+分钟*60+秒
@财产
def小时数(自我):
返回self.totalsecs//3600
@财产
def分钟数(自我):
返回self.\u获取\u剩菜()//60
@财产
def秒数(自我):
返回self.\u获取\u剩菜()%60
def_获取_剩菜(自我):
返回self.totalsecs%3600
def增量(自身,t):
self.totalsecs+=t
用法示例:
>t1=MyTime(5,5,5)
>>>t1.2小时
5.
>>>t1.小时数()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:“int”对象不可调用
>>>t1.5秒
5.
>>>t1.2秒
18305
>>>t1.增量(10)
>>>t1.5秒
15
>>>t1.2秒
18315
我不知道您是否注意到了,但实际上您不再需要增量
功能了:
>>t1.totalsecs+=10
>>>t1.2秒
18325
我知道property
一定比您现在做的要超前一点,但我认为这值得一个例子
编辑:注意到,没有必要将totalsecs
也设为属性
引用他的评论:Python属性的伟大之处在于,您不需要像在某些语言中那样将所有内容都转换为getter和setter来保持一致的接口
只有出于某种原因,您想隐藏MyTime
的内部实现时,才可以将totalsecs
设置为属性(只读)(显然,重新整合increment()
方法)。我可能会将对“totalsecs”的访问排除在属性中,然后使用该属性:
class MyTime:
def __init__(self, hrs=0, mins=0, secs=0,):
""" Create a new MyTime object initialized to hrs, mins, secs.
The values of mins and secs may be outside the range 0-59,
but the resulting MyTime object will be normalized.
"""
self.totalsecs = hrs*3600 + mins*60 + secs
@property
def totalsecs(self):
return self.hours * 3600 + self.minutes * 60 + self.seconds
@totalsecs.setter
def totalsecs(self, totalsecs):
self.hours = totalsecs // 3600 # split in h, m, s
leftoversecs = totalsecs % 3600
self.minutes = leftoversecs // 60
self.seconds = leftoversecs % 60
def increment(self,t):
# increase the time by t amount
self.totalsecs += t
当然,如果这样做,就不再需要increment()
方法。
另外,如果您以后决定切换到Rik Poggi的解决方案,只存储totalsecs值,并将小时、分钟、秒转换为属性,则您的更改最小。在所有情况下都同意,但将totalsecs
转换为属性除外-它的功能与普通属性完全相同,那么为什么要加入额外的功能呢?只需将其作为属性保留,除非您需要更改它。Python属性的优点在于,您不需要像在某些语言中那样,将所有内容都转换为getter和setter来保持一致的接口。@Lattyware:这一点很好。我只是有点被财产迷住了:)我更新了我的答案。