Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3/Classes/OOP/如何使用方法更改对象自身值?_Python_Oop_Class_Python 3.x - Fatal编程技术网

Python3/Classes/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

我正在学习python如何像计算机科学家一样思考:学习python 3

我正在学习OOP,并编写了一些代码来回答书中的一个问题,但我觉得我应该做些别的事情

所讨论的代码是
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:这一点很好。我只是有点被财产迷住了:)我更新了我的答案。