如何有效地更新对象的属性

时间:2016-08-14 04:22:27

标签: python object

我正在创建一个“宠物游戏”,以便在python中训练我的计算技能(这只是一个借口:因为它很有趣)。

我决定做一个简单的RPG游戏。为此,我定义了类英雄

class hero:
    #Common class for the main character
    def __init__(self, name, lvl, str, agi, vit, int, luk, prof):
        self.name = name
        self.lvl = lvl
        self.str = str
        self.agi = agi
        self.vit = vit
        self.int = int
        self.luk = luk
        self.prof = prof
        self.exp = 0
        if prof==1:
            self.dmg=3*(self.str)+1*(self.agi)
            self.skillList=['heavySlash01']
            self.strUp=3
            self.agiUp=1
            self.vitUp=2
            self.intUp=1
            self.lukUp=1
        if prof==2:
            self.dmg=1*(self.str)+3*(self.agi)
            self.skillList=['doubleAttack02']
            self.strUp=1
            self.agiUp=3
            self.vitUp=1
            self.intUp=1
            self.lukUp=2
        if prof==3:
            self.dmg=4*(self.int)
            self.skillList=['fireBall03']
            self.strUp=1
            self.agiUp=1.5
            self.vitUp=0.5
            self.intUp=3.5
            self.lukUp=1.5
        self.hp=19*vit

然而,我注意到,每当英雄升级,我需要分别更新其所有状态。例如,我需要手动更新hero.dmg。更改agistrint并未像我预期的那样自动更改dmg

我的问题是:有没有办法让dmg根据其公式自动更新?

2 个答案:

答案 0 :(得分:1)

dmg设为属性,而不是设置__init__功能。 __init__仅在初始化实例时运行,这就是事情未更新的原因。但是,只要访问该属性,将其设为属性就会运行该方法。

@property
def dmg(self):
    if prof==1:
        return 3*(self.str)+1*(self.agi)
    if prof==2:
        ...

答案 1 :(得分:1)

最好在你的情况下使用继承:

<!-- block -->
<div class="row grid events-block">

    <?php
    $parent = $post->ID;
    // query_posts('posts_per_page=15&post_type=page&post_parent='.$parent);
    query_posts(array('posts_per_page'=>'1', 'post_type' => 'page', 'post_parent' => $parent, 'paged' => get_query_var('paged')));
        while (have_posts()) : the_post();
    ?>

    <!-- item -->
    <div class="grid-item col-md-6 col-sm-6 col-xs-12 event-item">

        <div class="date-box">
            <?php echo $event_dates; ?>
        </div>

        <div class="event-item-text-box">
            <div class="event-item-text-inner-box">
                <h3 class="heading-item"><a href="#" target="_blank"><?php the_title(); ?></a></h3>
                <p><?php the_excerpt(); ?></p>
            </div>
        </div>

    </div>
    <!-- item -->
     <?php endwhile; ?>

     <?php
     // Reset the post to the original after loop. otherwise the current page becomes the last item from the while loop.
     // https://codex.wordpress.org/Function_Reference/wp_reset_query
     wp_reset_query();
     ?>

</div>
<!-- block -->

<?php $args = array(
    'base'               => '%_%',
    'format'             => '?paged=%#%',
    'total'              => 1,
    'current'            => 0,
    'show_all'           => false,
    'end_size'           => 1,
    'mid_size'           => 2,
    'prev_next'          => true,
    'prev_text'          => __('« Previous'),
    'next_text'          => __('Next »'),
    'type'               => 'plain',
    'add_args'           => false,
    'add_fragment'       => '',
    'before_page_number' => '',
    'after_page_number'  => ''
); ?>

<?php echo paginate_links( $args ); ?>