类的每个实例的方法都完全相同还是可以不同?

2024-06-01 09:03:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段代码可以计算稠密恒星的质量和密度分布。其中,每个实例方法都包含一组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):来“调用”self,但我不能在那里引用它,这让我感到困惑。尽管我认为如果我说我不能直接引用它的原因是因为self是尚未创建的类的实例的占位符,而不是一个普通的变量,那么我理解的是正确的?你知道吗

另一件我很好奇的事情是,类的每个实例是否都有自己的方法集——也就是说,如果我

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

Star类的这两个实例是否都具有完全相同的实例方法“integrate()”,或者它们中的每一个都有可能(本质上)具有一个单独的“integrate()”?你知道吗

总之,我想做一个程序让我

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

在这两种情况下,实例方法integration()是不同的。这可能吗?如果是的话,如何-如果不是,是否有另一种简单的方法来避免在每次函数调用时重复If-then求值的问题?你知道吗

您可以在这里找到我的脚本的python2.7.6可运行版本:mainconstants


Tags: 实例方法代码selfifdef语句integration
1条回答
网友
1楼 · 发布于 2024-06-01 09:03:00

您使用实例属性来模拟继承,而不是直接使用继承。你知道吗

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()

相关问题 更多 >