1

そのため、私は通常 OOP を使用しておらず、思ったほど理解していないようです。

(地理的) 州のクラスがあるとします。

class State(object):
    @property
    def population(self):
        return self._population
    @population.setter
    def population(self,value):
        if value < 0:
            raise ValueError("Population must not be negative")
        else:
            self._population = value

そして、事実上同一の (現時点では) Town のクラス:

class Town(State):
    @property
    def population(self):
        return self._population
    @population.setter
    def population(self,value):
        if value < 0:
            raise ValueError("Population must not be negative")
        else:
            self._population = value

ここで、State をインスタンス化し、それに特定の集団を与えるとします。State インスタンスの人口を継承する Town のインスタンスを作成するにはどうすればよいですか? (一時的に、私は推測します - これは単なる例です。) または、継承ではなく構成を使用する必要がありますか?

私が現在考えている方法では、これはうまくいくはずです:

s = State()

s.population = 10

t = Town(s)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-141-00f052d998f0> in <module>()
----> 1 t = Town(s)

TypeError: object.__new__() takes no parameters
4

2 に答える 2

3

町が州であるとは言いません(シンガポールや香港に住んでいる場合を除きます!)。しかし、州には町があると言えます。それは構成を示します。

デフォルトでは、州には人口属性さえないことに注意してください。したがって、State から継承しても、Town には属性が与えられません。

class State(object):
    @property
    def population(self):
        return self._population
    @population.setter
    def population(self,value):
        if value < 0:
            raise ValueError("Population must not be negative")
        else:
            self._population = value

s = State()
print s.population

--output:--
raceback (most recent call last):
  File "1.py", line 13, in <module>
    print s.population
  File "1.py", line 4, in population
    return self._population
AttributeError: 'State' object has no attribute '_population'

だからあなたが言うとき:

ここで、State をインスタンス化し、それに特定の集団を与えるとします。State インスタンスの人口を継承する Town のインスタンスを作成するにはどうすればよいですか?

... Town クラスには State のインスタンスに関する知識がないため、これは意味がありません。Town インスタンスに State インスタンスと同じ人口を与えることに対する明白な答えは、次のようにすることです。

class State(object):
    @property
    def population(self):
        return self._population
    @population.setter
    def population(self,value):
        if value < 0:
            raise ValueError("Population must not be negative")
        else:
            self._population = value

class Town(object):
    def __init__(self, population):
        self._population = population

    @property
    def population(self):
        return self._population

s = State()
s.population = 30
print s.population

t = Town(s.population)
print t.population

コンポジションを使用すると、次のようなことができます。

class State(object):
    def __init__(self, name, *towns):
        self.name = name
        self.towns = towns 

    @property
    def population(self):
        total = 0
        for town in self.towns:
            total += town.population
        return total

class Town(object):
    def __init__(self, name, population):
        self._population = population

    @property
    def population(self):
        return self._population

    @population.setter
    def population(self,value):
        if value < 0:
            raise ValueError("Population must not be negative")
        else:
            self._population = value

detroit = Town("Detroit", 40)
lansing = Town("Lansing", 100)
detroit.population -= 10
print detroit.population
print lansing.population

s = State("Michigan", detroit, lansing)
print s.population

--output:--
30
100
130
于 2013-08-13T00:06:13.337 に答える
1

あなたが今書いているように、あなたは町を州であると説明しましたが、州は必ずしも町ではありません. つまり、特に指定がない限り、タウンはデフォルトで州とまったく同じように動作します。

State を Town イニシャライザに渡したい場合は、次のような関数を作成する必要があります。

class Town(State):
    def __init__(self, state):
        self._population = state._population

その後、TypeError例から を取得しないでください。期待どおりに動作します。

于 2013-08-13T00:15:38.510 に答える