在母类python中调用子变量

在母类python中调用子变量,python,class,Python,Class,我正在尝试访问子类的“Table\u Name变量”,以使“Load\u Data”方法根据转换父类的子类执行不同的操作。 还有,是否有方法知道调用父类的子类 class DataBaseClass(obj): .. def Load_Data(): if Table_Name?? == Child1.Table_Name: load_Child1_Data if Table_Name == Child2.Table_Nam

我正在尝试访问子类的“Table\u Name变量”,以使“Load\u Data”方法根据转换父类的子类执行不同的操作。
还有,是否有方法知道调用父类的子类

class DataBaseClass(obj):
    ..
    def Load_Data():
        if Table_Name?? == Child1.Table_Name:
            load_Child1_Data
        if Table_Name == Child2.Table_Name:
            load_Child2_Data    
    ..

class Child1(DataBaseClass):
    ..
    Table_Name = TableName1
    ..

class Child2(DataBaseClass):
    ..
    Table_Name = TableName2
..

import * 
..
Child1.Load_Data()
Child2.Load_Data()

只需在子类上实现
load_data
。大概是这样的:

class Child1(Base):
    ...
    def load_data():  
        # CHILD1's OWN LOGIC

class Child2(Base):
   ...
    def load_data():  
        # CHILD2's OWN LOGIC
class BaseClass(object):

    @classmethod
    def load_data(cls):
        try:
            return some_external_load_function(cls.DATA_FILE_NAME)
        except AttributeError:
            raise NotImplementedError(
                'It seems you forgot to define the DATA_FILE_NAME attribute '
                'on you child class.')

class Child1(BaseClass):
    DATA_FILE_NAME = 'my_one_data_file.data'

class Child2(BaseClass):
    DATA_FILE_NAME = 'my_other_data_file.data'

(根据您的评论进行更新。)

如果所有子类都需要不同的逻辑,那么必须为每个子类编写该逻辑。但是,如果只有一些异常,则只能为这些异常重写该方法

但是如果只有几个已知的可能性,那么您可以定义一个类属性,并且只在子对象上更改该属性,如下所示:

class Base(obj):
    custom_attribute = 'default_value' 

    def load_data(self):  
        if self.custom_attribute == SOMETHING:
             pass
        else:
             pass    

class Child1(Base):
    custom_attribute = 'child1_value'
    ...

class Child2(Base):
    custom_attribute = 'child2_value'
    ...

只需在子类上实现
load_data
。大概是这样的:

class Child1(Base):
    ...
    def load_data():  
        # CHILD1's OWN LOGIC

class Child2(Base):
   ...
    def load_data():  
        # CHILD2's OWN LOGIC
class BaseClass(object):

    @classmethod
    def load_data(cls):
        try:
            return some_external_load_function(cls.DATA_FILE_NAME)
        except AttributeError:
            raise NotImplementedError(
                'It seems you forgot to define the DATA_FILE_NAME attribute '
                'on you child class.')

class Child1(BaseClass):
    DATA_FILE_NAME = 'my_one_data_file.data'

class Child2(BaseClass):
    DATA_FILE_NAME = 'my_other_data_file.data'

(根据您的评论进行更新。)

如果所有子类都需要不同的逻辑,那么必须为每个子类编写该逻辑。但是,如果只有一些异常,则只能为这些异常重写该方法

但是如果只有几个已知的可能性,那么您可以定义一个类属性,并且只在子对象上更改该属性,如下所示:

class Base(obj):
    custom_attribute = 'default_value' 

    def load_data(self):  
        if self.custom_attribute == SOMETHING:
             pass
        else:
             pass    

class Child1(Base):
    custom_attribute = 'child1_value'
    ...

class Child2(Base):
    custom_attribute = 'child2_value'
    ...

实现此功能的正确方法是

您需要重写子类中的
Load\u data
方法

class DataBaseClass(object):
    def Load_Data(self):
        raise NotImplementedError("Subclass must implement abstract method")

class Child1(DataBaseClass):
    def Load_Data(self):
        # implement load_data for Child1
        print('Child1')

class Child2(DataBaseClass):
    def Load_Data(self):
        # implement load_data for Child2
        print('Child2')

Child1 = Child1()
Child2 = Child2()

Child1.Load_Data()
Child2.Load_Data()
输出

Child1
Child2

实现此功能的正确方法是

您需要重写子类中的
Load\u data
方法

class DataBaseClass(object):
    def Load_Data(self):
        raise NotImplementedError("Subclass must implement abstract method")

class Child1(DataBaseClass):
    def Load_Data(self):
        # implement load_data for Child1
        print('Child1')

class Child2(DataBaseClass):
    def Load_Data(self):
        # implement load_data for Child2
        print('Child2')

Child1 = Child1()
Child2 = Child2()

Child1.Load_Data()
Child2.Load_Data()
输出

Child1
Child2

我想你想做的是这样的:

class Child1(Base):
    ...
    def load_data():  
        # CHILD1's OWN LOGIC

class Child2(Base):
   ...
    def load_data():  
        # CHILD2's OWN LOGIC
class BaseClass(object):

    @classmethod
    def load_data(cls):
        try:
            return some_external_load_function(cls.DATA_FILE_NAME)
        except AttributeError:
            raise NotImplementedError(
                'It seems you forgot to define the DATA_FILE_NAME attribute '
                'on you child class.')

class Child1(BaseClass):
    DATA_FILE_NAME = 'my_one_data_file.data'

class Child2(BaseClass):
    DATA_FILE_NAME = 'my_other_data_file.data'

这种模式在某些情况下是完全可以接受的,但很难从伪代码示例中判断您尝试执行的操作是否属于这种情况。

我认为您尝试执行的操作如下:

class Child1(Base):
    ...
    def load_data():  
        # CHILD1's OWN LOGIC

class Child2(Base):
   ...
    def load_data():  
        # CHILD2's OWN LOGIC
class BaseClass(object):

    @classmethod
    def load_data(cls):
        try:
            return some_external_load_function(cls.DATA_FILE_NAME)
        except AttributeError:
            raise NotImplementedError(
                'It seems you forgot to define the DATA_FILE_NAME attribute '
                'on you child class.')

class Child1(BaseClass):
    DATA_FILE_NAME = 'my_one_data_file.data'

class Child2(BaseClass):
    DATA_FILE_NAME = 'my_other_data_file.data'

这种模式在某些情况下是完全可以接受的,但很难从伪代码示例中判断您要做的是否属于这种情况。

为什么要这样做?反向继承是不自然的。假设我对OOP太陌生。我看到了,我很困惑。你为什么要这样做?反向继承是不自然的。假设我对OOP太陌生。我看到了,我只是感到困惑。谢谢,这就是我要做的!!我只是想知道是否有办法保存一些代码行,因为我会制作很多子类谢谢,这就是我要做的!!我只是想知道是否有办法保存一些代码行,因为我会准确地生成很多子类!!这将是伟大的实施!!!,但是如果我想像这个孩子一样叫“加载数据”1.加载数据(??
可能吗?我不知道你这里所说的
是什么意思,也不知道问号。但是,由于我创建了
load\u data
类方法,因此您可以直接在子类上调用这些方法,而无需先实例化它们。例如,要将数据从
my_one_data_file.data
直接加载到
my_data
,您可以这样做:
my_data=Child1.load_data()
!!这将是伟大的实施!!!,但是如果我想像这个孩子一样叫“加载数据”1.加载数据(??
可能吗?我不知道你这里所说的
是什么意思,也不知道问号。但是,由于我创建了
load\u data
类方法,因此您可以直接在子类上调用这些方法,而无需先实例化它们。例如,要将数据从
my\u one\u data\u file.data
直接加载到
my\u data
,您可以这样做:
my\u data=Child1.load\u data()