Python类对象/属性

2024-05-18 23:25:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过一个在线课程学习python,一直做得很好,我偶然发现了这个问题。通常情况下,当我遇到问题时,我只是在谷歌上搜索答案或查找指南,但这里的问题是我甚至不确定我在寻找什么

我目前有以下代码。我有一项任务,使每项训练强度都有一个特定的值,例如低=3、中=6和高=12。然后我可以通过持续时间找到燃烧的卡路里,这些值取决于传入课堂的强度和持续时间

我不知道的是如何给类方法赋值?我试过列表和字典,但都有错误。我试着写If语句来尝试If self.intensity(getattr)=“Low”:然后x=3,以此类推

我真的不知道从哪里开始寻找答案,所以我问你们

代码目前是(我知道片段丢失了),我目前只关注为强度赋值

class ExerciseSession:
def __init__(self, exercise, intensity, duration):
    self.exercise = exercise
    self.intensity = intensity
    self.duration = duration

def get_exercise(self):
    return self.exercise

def get_intensity(self):
    return self.intensity

def get_duration(self):
    return self.duration + " minutes"

def set_exercise(self, excersice):
    self.set_exercise = exercise

def set_intensity(self, intensity):
    self.set_intensity = intensity

def set_duration(self, duration):
    self.set_duration = duration   

new_exercise = ExerciseSession("Running", "Low", 60)
print(new_exercise.get_exercise())
print(new_exercise.get_exercise())
print(new_exercise.get_intensity())
print(new_exercise.get_duration())
new_exercise.set_exercise("Swimming")
new_exercise.set_intensity("High")
new_exercise.set_duration(30)
print(new_exercise.get_exercise())
print(new_exercise.get_intensity())
print(new_exercise.get_duration())
print(new_exercise.get_intensity())
print(new_exercise.get_duration())
new_exercise.set_exercise("Swimming")
new_exercise.set_intensity("High")
new_exercise.set_duration(30)
print(new_exercise.get_exercise())
print(new_exercise.get_intensity())
print(new_exercise.get_duration())

我只是在一个类中做错了列表/字典,还是缺少了一些非常简单的东西。我理解类和方法,但在一个类中似乎有些东西的工作方式略有不同,等等


Tags: 方法答案代码selfnewgetreturndef
2条回答

首先-您的setter是否按照您的问题中的方式实现?如果是这样的话,您似乎试图用一个值覆盖您的方法。set_exercise()中还有一个小错误。将以下内容与您的问题进行比较:

def set_exercise(self, exercise):
    self.exercise = exercise

def set_intensity(self, intensity):
    self.intensity = intensity

def set_duration(self, duration):
    self.duration = duration   

然后,您可以在课外编写测试语句,以确定在根据强度计算消耗的卡路里数量时使用的值


或者,Python提供了一种简洁的方式来封装数据,而无需通过@property decorator求助于getter/setter方法。然后可以以简单的方式设置和检索该属性。这在从其他属性派生属性的更复杂的情况下特别有用,这意味着您将始终访问最新的属性。这里更详细地介绍了这一点:"public" or "private" attribute in Python ? What is the best way?

class ExerciseSession:
    def __init___(self, exercise, intensity, duration):
        self._exercise = exercise
        self._intensity = intensity
        self._duration = duration

    @property
    def exercise(self):
        return self._exercise

    @property
    def intensity(self):
        if self._intensity == "Low":
            out = 3
        elif self._intensity == "Medium":
            out = 6
        elif self._intensity == "High":
            out = 12
        else:
            out = None

        return out

    @property
    def duration(self):
        return self._duration

注意:在每个实例属性之前的“u”用于表示内部属性通常是私有的

然后可以按如下方式访问这些属性(注意,我们不必调用任何方法,例如new_exercise.exercise()):

new_exercise = ExerciseSession("Running", "Low", 60)
print(new_exercise.exercise)
print(new_exercise.intensity)
print("{} minutes.".format(new_exercise.duration))

如果您需要能够更新对象上的运动类型/持续时间/强度,而不仅仅是创建一个新的运动类型/持续时间/强度,则可以使用@.setter装饰器添加setter方法,例如:

@exercise.setter
def exercise(self, value):
    self._exercise = value

这些属性可以更新为:

new_exercise.exercise = "Swimming"

做同样的事情:-)

def calories_burned(self):
    if self.intensity == "Low":
        return 4 * self.duration
    elif self.intensity == "Medium":
        return 8 * self.duration
    else:
        return 12 * self.duration
    

相关问题 更多 >

    热门问题