对于每个类的实例,方法是否完全相同,或者它们是否可以不同?

时间:2017-04-04 19:50:15

标签: python class methods instance

我有一段代码可以计算密集恒星的质量和密度分布。在其中,每个实例方法都包含一组if-then语句 - 根据星号和模型 - 选择合适的数学表达式。我将在底部附加整个更通用的代码片段,但是现在应该很好地删除一个删节版本。

class Star(object):
    def __init__(self,startype,relativity)
        self.star = startype
        self.r = relativity            

    def integration(self):
        if self.r == 'Galilean': 
           if self.star == 'White Dwarf':
                return simple_expression
           elif self.star == 'Neutron Star':
                return complicated_expression

        elif self.r == 'Einstein':
           ...

'''Make a star'''
neutronEinstein = Star(startype='Neutron',relativity='Einstein')

'''Call integration method'''
Mass = neutronEinstein.integration()

这里的问题是,每次调用集成方法时,都必须评估那些if-then语句,这会大大减慢代码的执行速度 - 与更专业的实现相比,代码运行速度变慢一个数量级。我试图将if-then语句放在定义之外,如此

    if self.r == 'Galilean': 
        if self.star == 'White Dwarf':
            def derivativeOfMass(self):
                return simple_expression

但这并不起作用,因为自我无法识别。我发现从某种意义上说,我可以打电话'我班上的def foo(self):自我,但我无法在那里引用它。虽然如果我说我之所以不能直接引用它,我认为我理解正确,那就是“自我”。是尚未创建的类实例的占位符,而不是工厂变量的运行?

我很好奇的另一件事是,如果班级的每个实例都有自己的一套方法 - 也就是说,如果我做了

neutronEinstein = Star(startype='Neutron',relativity='Einstein')
neutronGalilean = Star(startype='Neutron',relativity='Galilean')

这两个Star类的实例都具有完全相同的实例方法&integration()',或者它们中的每一个实际上都可以 - 具有一个单独的'整合()'?

总而言之,我想制作一个让我做的程序

MassE = neutronEinstein.integration()
MassG = neutronGalilean.integration()

以这种方式实例方法integration()在这两种情况中的每一种中都是不同的。这可能吗?如果是这样,如何 - 如果没有,是否有另一种直接的方法来避免在每次函数调用时重复if-then评估的问题?

你可以在这里找到我的脚本的python 2.7.6可运行版本:mainconstants

1 个答案:

答案 0 :(得分:1)

您正在使用实例属性来模拟继承,而不是直接使用继承。

class Star(object):
    pass

class Galilean(Star):
    pass

class Einstein(Star):
    pass

class WhiteDwarf(Galilean):
    def integration(self):
        return simple_expression

class NeutronStar(Galilean):
    def integration(self):
        return complicated_expression

'''Make a star'''
neutronEinstein = NeutronStar()

'''Call integration method'''
mass = neutronEinstein.integration()