簡體   English   中英

Python繼承的基類變量

[英]Python inherited base class variables

所以我有兩個孩子班的Base班。 我的想法是,我將擁有一個包含所有可以插入到一個子類中的數據的模型。 然后調用一個方法在每個子類上設置標題,然后將數據從Model復制到Child類實例。 但是我發現,在第一個類實例上調用add_header方法(在本例中為a)之后,b也獲得了標頭。 哪一種讓我感到困惑,因為我認為初始化的類不會互相影響。 我的問題是為什么會這樣,是否可以避免?

class Base(object):
    __model__ = None
    headers = ['base_header','base_header2']

    def add_header(self, *args):
        for h in args:
            self.headers.append(h)

    def set_header_values(self):
        for h in self.headers:
            setattr(self, h, getattr(self.__model__, h))


class ChildOne(Base):
    def __init__(self, model):
        self.__model__ = model


class ChildTwo(Base):
    def __init__(self, model):
        self.__model__ = model


class Model(object):
    foo = 'bar'

m = Model()
a = ChildOne(m)
b = ChildTwo(m)
a.add_header('tralala')
print b.headers // Output ['base_header','base_header2','tralala']

“在第一個類實例上調用add_header方法(在本例中為a)之后,b也獲得了標頭”,因為兩個實例共享相同的變量標頭。 標頭應該是實例而不是變量

class Base(object):
    __model__ = None
    def __init__(self):
        self.headers = []

    def add_header(self, *args):
        for h in args:
            self.headers.append(h)

    def set_header_values(self):
        for h in self.headers:
            setattr(self, h, getattr(self.__model__, h))


class ChildOne(Base):
    def __init__(self, model):
        super(ChildOne, self).__init__()
        self.__model__ = model


class ChildTwo(Base):
    def __init__(self, model):
        super(ChildTwo, self).__init__()
        self.__model__ = model


class Model(object):
    foo = 'bar'

m = Model()
a = ChildOne(m)
b = ChildTwo(m)
a.add_header('tralala')
print a.headers
print b.headers 

產量

[ 'TRALALA']

[]

附加說明

Python類和實例變量會引起混亂。 考慮以下示例:

class A:
    l =[] 

class B:
    l =[]

x = A()
y = A()
x.l.append(1)
print 'class A ', A.l, x.l, y.l

x = B()
y = B()
x.l = [1]
print 'class B ', B.l, x.l, y.l

產量

class A  [1] [1] [1]
class B  [] [1] []

這兩個示例都使用對數據成員'l'的非常相似的訪問,但是第一個示例修改了已經存在的類變量,而第二個示例創建了一個新的實例變量。

在您的示例中,您應該具有self.headers = [...]而不是self.append(...)分配,您的輸出將有所不同。

此外,問題中的__model__屬性與問題無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM