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

和一个几乎相同(目前)的城镇类:

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

现在假设我实例化一个状态并给它一个特定的人口。我将如何创建一个继承该州实例人口的城镇实例?(暂时,我想 - 这只是一个例子。)或者我应该使用组合而不是继承?

我目前正在考虑的方式,这应该有效:

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'

所以当你说:

现在假设我实例化一个状态并给它一个特定的人口。我将如何创建一个继承该州实例人口的城镇实例?

...这没有任何意义,因为 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

你现在写它的方式,你已经将一个城镇描述为一个州,而一个州不一定是一个城镇。也就是说,除非另有说明,否则默认情况下 Town 的行为与 State 完全相同。

如果您想将 State 传递给 Town 初始化程序,那么您需要创建一个类似以下的函数:

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

在那之后,你不应该TypeError从你的例子中得到,它会表现出你所期望的样子。

于 2013-08-13T00:15:38.510 回答