使用Python类进行封装,而不是实例化



我已经遇到了一些看起来像这样的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的构造函数未超载。

最新更新