Python:从子类列表中选择

时间:2016-02-17 07:46:18

标签: python class qcombobox

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

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

用户应该选择一个具体的类。所以我有两个问题:1。如何访问所有子类相等的值(在本例中为alphabt)。 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()

在材料中我声明了具体的类。任何人都可以告诉/建议/帮助我做错了或显示相同用法的示例。

提前谢谢你。

1 个答案:

答案 0 :(得分:0)

我不使用Qt,所以我无法帮助你处理这方面的事情,但我可以提供一些建议来改善你的课程。

您不需要为不同类型的混凝土创建子类,只需创建Concrete类的实例。为此,您需要为该类提供__init__方法。

alphabt属性可以定义为类属性,由类的所有实例共享。

为类提供__repr__和/或__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

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

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

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