Python: select 来自子类列表

Python: select from a list of subclasses

我是 python 和一般编程的初学者。我正在尝试为一些计算编写一个小程序。我有一个 material: concrete 和它的几种类型。 我创建了一个基础混凝土和几个子 classes。 Base class Concrete 具有一些对所有 subclass 都相同的属性。

class Concrete:
    self.Name = name  #
    self.Rb = rb   #changes depending on concrete subclass
    self.alphabt = 0.0001 #equal for every concrete subclass

class concreteB25(Concrete):
    self.Name = 'B25'
    self.Rb = 25.0
 class concreteB30(Concrete):
    self.Name = 'B30'
    self.Rb = 30.0

用户应该select具体class。所以我有两个 questions:1。我如何访问所有 subclasses(在这种情况下为字母)相等的值。 2.我如何保留所选的混凝土?我正在尝试使用 QCombobox 但无法弄清楚如何正确使用它进行分配。

import sys
from PyQt5.QtWidgets import (QWidget,QComboBox,QLabel,QApplication)
import materials

class Form(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.lbl = QLabel("Concrete",self)
        self.combo = QComboBox(self)
        concreteclasses = ['B25', 'B30']
        self.combo.addItems(concreteclasses)
        self.combo.move(50, 50)
        self.combo.activated[str].connect(self.onActivated)
        self.setGeometry(300,300,300,200)
        self.setWindowTitle('ConcreteComboBox')
        self.show()

    def onActivated(self, text):
        chosenclass = self.combo.itemText(self.combo.currentIndex())
        chosenConcrete = None
        if chosenclass == 'B25':
            chosenConcrete = materials.concreteB25()
        else:
            chosenConcrete = materials.concreteB30()

在 materials 中,我声明了具体的 classes。任何人都可以 tell/suggest/help 我做错了什么或显示相同用法的示例。

提前谢谢你。

我不使用 Qt,所以我无法在这方面帮助您,但我可以提供一些建议来改进您的 class。

对于不同类型的混凝土,您不需要子classes,只需创建您的混凝土实例class。为此,您需要为 class 提供一个 __init__ 方法。

alphabt 属性可以定义为 class 属性,由 class.

的所有实例共享

给 class 一个 __repr__ and/or __str__ 方法是个好主意,这样当您将它显式地或使用 print 转换为字符串时,它会提供有用的信息。

class Concrete(object):
    alphabt = 0.0001

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

    def __repr__(self):
        return 'Concrete({0}, {1})'.format(self.name, self.rb)

def make_concrete(name):
    return Concrete(name, float(name[1:]))

concreteB25 = make_concrete('B25')
concreteB30 = make_concrete('B30')

print(concreteB25, concreteB30)
print(concreteB25.alphabt, Concrete.alphabt)

输出

Concrete(B25, 25.0) Concrete(B30, 30.0)
0.0001 0.0001

请注意,我们可以从 Concrete 实例或 Concrete class 本身访问 .alphabt 属性。

顺便说一句,format 字符串 'Concrete({0}, {1})' 在 Python 2.7 及更高版本中可以简化为 'Concrete({}, {})'

您可以使用 make_concrete 辅助函数在 materials 模块中创建一些预定义的具体实例,或者您可以在 onActivated 方法中使用它来创建它们"on the fly".