gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:25:53 24 4
gpt4 key购买 nike

我遇到过一些 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

如果我更聪明,我可以弄清楚如何将字符串文字放入构造函数中......但这现在并不重要。

我的问题是关于以这种方式使用类。是的,每次调用 print() 时都会创建该类的一个实例。然而,i 在每个类别中都是“永久”的。

这让我觉得这不是一种面向对象的方法,而是一种使用类来完成封装和/或函数式编程范例的方法,因为实例是完全暂时的。换句话说,类的实例永远不会出于其自身目的而实例化;它的存在只是为了允许访问类范围内的方法和变量来完成它们的任务,然后它就被扔掉了。在许多情况下,类机制似乎是以一种间接的方式使用的,以便利用继承和名称解析/间距:从概念上讲,类的实例永远不需要构建或使用。

这是标准的 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

关于python - 使用Python类进行封装,而不是实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47407887/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com