我已经遇到了一些看起来像这样的python代码的示例:
class GiveNext :
list = ''
def __init__(self, list) :
GiveNext.list = list
def giveNext(self, i) :
retval = GiveNext.list[i]
return retval
class GiveABCs(GiveNext):
i = -1
def _init__(self, list) :
GiveNext.__init__(self, list)
def giveNext(self):
GiveABCs.i += 1
return GiveNext.giveNext(self, GiveABCs.i)
class Give123s(GiveNext):
i = -1
def _init__(self, list) :
GiveNext.__init__(self, list)
def giveNext(self):
Give123s.i += 1
return GiveNext.giveNext(self, Give123s.i)
for i in range(3):
print(GiveABCs('ABCDEFG').giveNext())
print(Give123s('12345').giveNext())
输出为:A 1 B 2 C 3
如果我更聪明,我可以弄清楚如何将字符串文字放在构造函数中...但是现在并不重要。
我的问题是这种方式使用课程。是的,每次都会在打印()中呼叫时都会创建类的实例。但是,我在每个班级中都是"永久的"。
这使我少是一种面向对象的方法,而更多的方法是使用类完成封装和/或功能编程范式的一种方式,因为该实例完全是跨性别的。换句话说,班级的实例永远不会出于自己的目的实例化。它只能允许访问整个班级的方法和变量来完成他们的事情,然后将其扔掉。在许多情况下,似乎以反手方式使用类机制,以利用继承和名称分辨率/间距:从概念上讲,从来没有真正需要真正构建或使用类的实例。
这个标准的python形式?
奖励问题:如何将字符串文字放入每个类声明中?现在,即使我将giveabcs的_init__更改为
GiveNext.__init__(self, 'wxyz')
它完全忽略了" wxyz"字样,并且使用了" abcdef" - 即使它从未提及...
请不要使用此代码学习python。正如其他人提到的那样,此代码违反了许多Python原则。
一个示例: list
是一种python内置类型。不要覆盖它,尤其是不使用字符串实例!
该代码还混合了类和实例变量,并且不使用子类中的super()
。
此代码试图模拟迭代器。因此,只需使用iterator
:
give_abcs = iter('ABCDEFG')
give_123s = iter('12345')
for _ in range(3):
print(next(give_abcs))
print(next(give_123s))
# A
# 1
# B
# 2
# C
# 3
如果您真的想修复上述代码,则可以使用:
class GiveNext :
def __init__(self, iterable) :
self.i = - 1
self.iterable = iterable
def giveNext(self) :
self.i += 1
return self.iterable[self.i]
giveABCs = GiveNext('ABCDEFG')
give123s = GiveNext('12345')
for _ in range(3):
print(giveABCs.giveNext())
print(give123s.giveNext())
它输出:
A
1
B
2
C
3
OP中的此代码是令人难以置信的废话。它不仅是漫长的,不可读的,还滥用OO功能,并且根本不使用Python功能(迭代器是标准的Python功能)。这是对pythonist方法的建议:
giveABCs = iter('ABCDEFG')
give123s = iter('12345')
for i in range(3):
print(next(giveABCs))
print(next(give123s))
关于您的奖励问题:我想您正在修改giveabcs和give123s的_init__()
方法。正常的是,无论您放入任何代码都没有效果,因为Python构造函数是__init__()
(带有2个领先的下划线,而不是1个)。因此GiveNext
的构造函数未超载。