首页 > 解决方案 > 为什么我可以从子类中的父级访问一些参数(而有些则不能)?

问题描述

我一直在尝试并试图找到答案,但仍然不明白为什么我可以访问一些没有传递给子类而有些没有传递的参数。

鉴于此代码:


class Signals(object):
    
    def __init__(self, numbers):
        super().__init__()

        self.numbers = numbers
        self.factor = 2

    def get_calculations(self):
        self.beau = Beau(self.numbers)
        self.beau.calculation()
       
        self.jolais = Jolais()
        self.jolais.calculation()
        
        print("self.beau.value", self.beau.value)
        print("self.beau.avg", self.beau.avg)
        print("self.jolais.value", self.jolais.value)
        print("self.jolais.avg", self.jolais.avg)


class Beau(Signals):
    
    def __init__(self, numbers):
        super().__init__(numbers)

    def calculation(self):
        numbers = self.numbers
        factor = self.factor
        
        self.value = sum(numbers) * factor
        self.avg = self.value/len(numbers)
        
class Jolais(Signals):
    
    def __init__(self):
        super().__init__()

    def calculation(self):

        numbers = [1,1,1]
        if type(self.numbers) == type(list()):
            numbers = self.numbers
        factor = self.factor
        
        self.value = sum(numbers) * factor
        self.avg = self.value/len(numbers)

Signals([1,2,3]).get_calculations()

..不会工作:__init__() missing 1 required positional argument: 'numbers'

将此位替换为:

class Jolais(Signals):
    
    def __init__(self):
        super().__init__("anything")

..会给我预期的结果:


self.beau.value 12
self.beau.avg 4.0
self.jolais.value 6
self.jolais.avg 2.0

那为什么self.factor即使没有通过也self.numbers不能访问呢?

标签: pythoninheritance

解决方案


我不确定您对代码的意图是什么,但您似乎有一个类层次结构,其中基类也尝试创建其子类的实例,这看起来很奇怪。

假设您想要一个层次结构,其中 Beau 和 Jolais 进行不同/更专业的计算,这可行:

class Signals(object):
    
    def __init__(self, numbers):
        super().__init__()

        self.numbers = numbers
        self.factor = 2
        self.value = None
        self.avg = None
        
    def printvalues(self):
        print("value", self.value)
        print("avg", self.avg)
        
    def calculation(self):
        raise Exception( "Calculation not implemented in Signal")

class Beau(Signals):
    
    def __init__(self, numbers):
        super().__init__(numbers)
        self.factor = 3

    def calculation(self):
        numbers = self.numbers
        factor = self.factor
        
        self.value = sum(numbers) * factor
        self.avg = self.value/len(numbers)
        
class Jolais(Signals):
    
    def __init__(self,numbers):
        super().__init__(numbers)
        # gave this a different factor from Beau
        self.factor = -4

    def calculation(self):

        numbers = [1,1,1]
        if type(self.numbers) == type(list()):
            numbers = self.numbers
        factor = self.factor
        self.value = sum(numbers) * factor
        self.avg = self.value/len(numbers)


beau = Beau([1,2,3])
jolais = Jolais([5,6,7])

print( "Beau" )
beau.printvalues()
beau.calculation()
beau.printvalues()

print( "Jolais" )
jolais.printvalues()
jolais.calculation()
jolais.printvalues()

结果:

Beau
value None
avg None
value 18
avg 6.0
Jolais
value None
avg None
value -72
avg -24.0

推荐阅读