<p>我引用了<a href="https://www.manning.com/books/practices-of-the-python-pro" rel="nofollow noreferrer">this book</a>,发现我的代码违反了许多继承规则。
下面引用的所有区块部分都来自本书</p>
<ul>
<li><p>我打破了继承的规则</p>
<ul>
<li>可替代性:
<blockquote>
<p>Using a different instance creation signature is a common way to violate <code>substitutability</code>.</p>
</blockquote>
<ul>
<li>在我的代码中,<code>BooksBorrowed.Counter</code>正在破坏<code>substitutabiltiy</code></li>
</ul>
</li>
<li>超类访问:
<blockquote>
<p>Overriding methods to take different numbers of arguments, and passing only some of them along using super(), can lead to confusion and poor maintainability.</p>
</blockquote>
<ul>
<li>在我的代码中,<code>BooksBorrowed.Counter.__init__</code>使用不同数量的参数</李>
</ul>
</li>
<li><code>has-a</code>关系
<blockquote>
<p>Use composition for has-a relationships</p>
</blockquote>
<ul>
<li>在我的代码中,“计数器”<code>has a</code>“状态类型”。但是,<code>status-type</code>是以继承方式重写的</李>
</ul>
</li>
</ul>
</li>
<li><p>如何使用作文方式</p>
<blockquote>
<p>Inversion of control says that instaed of creating instances of dependencies in your class, you can pass in existing instances for the clas to make use of.</p>
</blockquote>
<ul>
<li>在我的代码中有两种关系。它们是“BaseBookInfo”-“计数器”和“计数器”-“状态类型”
它们彼此紧密耦合,因此很难升级。它们需要松散耦合</李>
</ul>
</li>
</ul>
<p>这是我最后的代码,我觉得更好。如果您发现任何部分可以进一步改进,请回答我的问题,我将接受您的问题。我不想接受我的答案</p>
<pre class="lang-py prettyprint-override"><code>class BaseCounter(object):
def __init__(self, df):
self.df = df
self.total = len(self.df)
self.status = self.count_status()
def count_status(self):
return self.df['status'].value_counts()
class BaseBookInfo(object):
def __init__(self, df, counter):
self.df = df
self.counter = counter
bi = BaseBookInfo(book_df, BaseCounter(book_df))
class BBCounter(BaseCounter):
def __init__(self, df):
super().__init__(df)
self.types = dict()
def get_status_type(self, types):
self.types = types
def show_status(self):
is_delayed = self.status['good'] != self.total
if self.total:
if is_delayed:
result = 'DELAY_EXIST'
else:
result = 'NO_PROBLEM'
else:
result = 'ZERO_BORROW'
print(f'{self.types[result]}')
class BooksBorrowed(BaseBookInfo):
status_type = {
'ZERO_BORROW': 'no borrowed books',
'DELAY_EXIST': 'there are delayed books!!',
'NO_PROBLEM': 'there is no problem!!'
}
def __init__(self, df, counter):
super().__init__(df, counter)
self.counter.get_status_type(self.status_type)
bb = BooksBorrowed(book_df, BBCounter(book_df))
</code></pre>