Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类的每个实例的方法是完全相同的,还是不同的?_Python_Class_Methods_Instance - Fatal编程技术网

Python 类的每个实例的方法是完全相同的,还是不同的?

Python 类的每个实例的方法是完全相同的,还是不同的?,python,class,methods,instance,Python,Class,Methods,Instance,我有一段代码可以计算稠密恒星的质量和密度分布。其中,每个实例方法都包含一组if-then语句,这些语句根据星型和模型选择适当的数学表达式。我将在底部附加更一般的代码的全部内容,但是现在一个简略的版本应该可以做得很好 class Star(object): def __init__(self,startype,relativity) self.star = startype self.r = relativity def i

我有一段代码可以计算稠密恒星的质量和密度分布。其中,每个实例方法都包含一组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求值的问题

您可以在此处找到我的脚本的python 2.7.6可运行版本:,

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

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

多态性是您要寻找的,或者在Python的情况下更适合于duck类型。因此,在您的示例中,我将明确地将最通用的属性放在Star类中,爱因斯坦类中特定的属性,等等。此外,如果指定了
Start
子类的实例,则任何需要
Star
实例的代码都应该继续工作。如果Star中有调用integration()方法的方法,则这不起作用。有可能逆转继承的层次结构吗?作为参考,您可以在我在OP底部链接的脚本中搜索RK38,该脚本使用dMdr,我找到了一种方法dPdr.Nevermind。虽然我仍然觉得我不知道我在做什么,所以肯定还有其他的方法!