每次调用类实例时如何增加

时间:2018-10-24 00:48:46

标签: python oop

我正在学习有关Python中OOP的更多信息,但遇到了一些障碍。下面是我的代码:

class Player:

    bats = 0
    hit = 0
    freePass = 0
    out = 0
    defenseError = 0

    def __init__(self, name):
        self.name = name

        Player.hit+=1
        Player.freePass+=1
        Player.out+=1
        Player.defenseError+=1

#--------------------------------
def main():
    steve = Player("steve")
    steve.hit
    steve.hit
    steve.hit

#--------------------------------
main()

您可以说,我创建了一个类,该类应该在每次在main函数中调用一个实例时都增加一个计数器。例如,“ steve.hit”被称为三个不同的时间,因此,命中计数器应增加到3。但是每次我尝试尝试某些事情时,程序不会将这三个不同的调用计为一个,而是将这三个调用计为一个。谢谢您能给我的任何帮助

2 个答案:

答案 0 :(得分:3)

我更喜欢以下内容:

class Player:
    def __init__(self, name):
        self.name = name
        self.bats_ = 0
        self.hit_ = 0
        self.freePass_ = 0
        self.out_ = 0
        self.defenseError_ = 0
    def hit(self):
       self.hit_+=1
    def freePass(self):
       self.freePass_+=1
    def out(self):
       self.out_+=1
    def defenseError(self):
       self.defenseError_+=1

self代替Player,并为其创建函数,

然后称呼它(见评论):

def main():
    steve = Player("steve") # Create a player
    steve.hit() # add 1 to `hit`
    steve.hit() # add 1 to `hit` again
    steve.hit() # add 1 to `hit` again
    return steve.hit_ # to return, use `_hit` because in `__init__`, it's called `hit_`, which is added always

现在:

print(main())

输出:

3

是的,正如预期的那样。

甚至更好的@property

所以类应该是:

class Player:
    def __init__(self, name):
        self.name = name
        self.bats_ = 0
        self.hit_ = 0
        self.freePass_ = 0
        self.out_ = 0
        self.defenseError_ = 0
    @property
    def hit(self):
       self.hit_+=1
    @property
    def freePass(self):
       self.freePass_+=1
    @property
    def out(self):
       self.out_+=1
    @property
    def defenseError(self):
       self.defenseError_+=1

然后调用它(无需调用而无需括号):

def main():
    steve = Player("steve")
    steve.hit
    steve.hit
    steve.hit
    return steve.hit_

现在:

print(main())

输出:

3

是的,正如预期的那样。

答案 1 :(得分:0)

第一件事,您需要实例化您的课程。这实际上意味着根据您在类中定义的计划去构建对象(播放器)。您只需声明一个新变量steve = Player("steve")

__init__方法是一种特殊方法,在创建新对象时会自动调用。在这里,您的班级仅接受一个参数name。所有其他变量,例如hit都会自动分配为0。

如果要更改hit的值,则应创建一个函数(也称为方法。然后,您可以使用steve.increment_hit()非常简单地调用此方法。

class Player():
    """Class to represent a player."""
    def __init__(self, name):
        self.name = name
        self.hit = 0
        self.bats = 0
        self.freePass = 0
        self.out = 0
        self.defenseError = 0

    def increment_hit(self):
        """Increase hit count by one when called."""
        self.hit += 1

#  instantiate your class
steve = Player("steve")
print("Hits for '{}' after instantiate your class: {}\n".format(steve.name, steve.hit))

# call the increase_hit method 3 times
for i in range(3):
    steve.increment_hit()
    print("Hits for player {}: {}".format(steve.name, steve.hit))

尝试始终通过调用方法来更改变量的值,而不要直接访问变量本身。

例如,比起直接使用steve.increment_hit()访问类变量,最好使用steve.hit += 1

运行上面的代码后,您将获得以下输出:

 Hits for 'steve' after instantiate your class: 0

 Hits for player steve: 1
 Hits for player steve: 2
 Hits for player steve: 3