父类方法使用子类属性的问题。

发现一个问题,如果父类里面的方法需要使用子类的属性,那么父类里面的属性就会报属性未定义,也许不会影响使用,但是总觉得哪里不对,正确的方法应该是什么?如下,父类里面有一个治疗方法,可以治疗生命值,但是父类本身没有生命值和最大生命值的属性,因此在写代码的时候,程序会提示一些错误。

class Warriors:
    def healing(self, stone_number):  # 父类里面定义一个治疗方法,可以治疗生命值
        if self.health == self.max_health:
            return
        self.health += stone_number 
        if self.health > self.max_health:#  超过最大生命值,不再加生命值
            self.health = self.max_health


class Archers(Warriors):
    typename = '弓箭手'
    price = 100
    max_health = 100

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


img

不用管,运行没问题的

class Warriors:
    def healing(self, stone_number):  # 父类里面定义一个治疗方法,可以治疗生命值
        if self.health == self.max_health:
            return
        self.health += stone_number 
        if self.health > self.max_health:#  超过最大生命值,不再加生命值
            self.health = self.max_health
 
 
class Archers(Warriors):
    typename = '弓箭手'
    price = 100
    max_health = 100
 
    def __init__(self, name, health=max_health):
        self.name = name
        self.health = health
 
a = Archers("Tony", 50)
print(a.health) # 50
a.healing(30)
print(a.health) # 80
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7637567
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:将卷积结果输出成图片、 将随机生成的张量当成图片输出
  • 除此之外, 这篇博客: 万万想不到 10行代码搞定一个决策树中的 产生数据集 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这里我们会用sklearn来进行实验,通过查阅了sklearn中文文档,利用内置的样本的随机生成器生成我们需要的101维的数据

    我这里不对生成器做详细解释,具体介绍可以查阅文档,我用的生成器是多标签的生成器

    make_multilabel_classification 生成多个标签的随机样本,反映从a mixture of topics(一个混合的主题)中引用a bag of words (一个词袋)。每个文档的主题数是基于泊松分布随机提取的,同时主题本身也是从固定的随机分布中提取的。同样地,单词的数目是基于泊松分布提取的,单词通过多项式被抽取,其中每个主题定义了单词的概率分布。在以下方面真正简化了 bag-of-words mixtures (单词混合包):

    • 独立绘制的每个主题词分布,在现实中,所有这些都会受到稀疏基分布的影响,并将相互关联。
    • 对于从文档中生成多个主题,所有主题在生成单词包时都是同等权重的。
    • 随机产生没有标签的文件,而不是基于分布(base distribution)来产生文档
    • http://sklearn.apachecn.org/cn/0.19.0/_images/sphx_glr_plot_random_multilabel_dataset_0011.png

    首先定义我们的参数

    n_samples = 100000 # 100000个数据
    n_features = 100 # 100个特征
    n_classes = 1 # 分两类 [0 1]两类
    MAX_depth = 15 # 递归树最大的深度
    

    接着就开始生成我们的101维的数据

    # 生成数据
    X,y = make_multilabel_classification(n_samples=n_samples,n_features=n_features,n_classes=n_classes)
    X = X%2 # 得到的特征值为0或1
    print('X = ', X, X.shape)
    print('y = ', y, y.shape)
    
    X =  [[0. 0. 0. ... 0. 0. 0.]
     [1. 0. 0. ... 0. 0. 1.]
     [1. 0. 0. ... 0. 0. 0.]
     ...
     [0. 0. 0. ... 0. 0. 0.]
     [0. 1. 0. ... 0. 1. 0.]
     [0. 0. 0. ... 0. 0. 0.]] (100000, 100)
    y =  [[0]
     [0]
     [0]
     ...
     [1]
     [0]
     [1]] (100000, 1)
    

    我们可以看到我们的结果,我们生成了10万个100维的数据,作为我们的X,如何对应的还有10万个1维的数据,对应着我们的y,一个是我们的输入,另一个是我们的输出

  • 您还可以看一下 数智优佳学堂老师的智慧城市之智慧中台专题-数字孪生城市架构解决方案课程中的 数字孪生城市基本内涵小节, 巩固相关知识点