gpt4 book ai didi

不使用 def __init__(self) 的 Python 类

转载 作者:IT老高 更新时间:2023-10-28 20:41:42 25 4
gpt4 key购买 nike

我正在编写一系列文本菜单。使用下面的类和子类,它运行没有问题。但我正在审查我的编码,我想知道....我没有在类中使用 def __init__(self) 可以吗?我是否应该将数据成员放在 def __init__(Self): 中,例如 self.images = ()、self.options =()?如果我这样做了,我就不能使用 abc 模块进行约束,对吗?

class BaseMenu(object):
__metaclass__ = abc.ABCMeta

@abc.abstractproperty
def options(self):
pass

@abc.abstractproperty
def menu_name(self):
pass

def display(self):
header = "FooBar YO"
term = getTerminalSize()
#sys.stdout.write("\x1b[2J\x1b[H")
print header.center(term, '*')
print self.menu_name.center(term, '+')
print "Please choose which option:"
for i in self.options:
print(
str(self.options.index(i)+1) + ") "
+ i.__name__
)
value = int(raw_input("Please Choose: ")) - 1

self.options[value](self)

class Servers(BaseMenu):

menu_name = "Servers"
images = ()
foo = ()

def get_images(self):
if not self.images:
self.images = list_images.get_images()
for img in self.images:
print (
str(self.images.index(img)+1) + ") "
+ "Name: %s\n ID: %s" %
(img.name, img.id)
)

def get_foo(self):
if not self.foo:
self.foo = list_list.get_list()
for list in self.foo:
print "Name:", list.name
print " ID:", list.id
print

def create_servers(self):
create_server.create(self)

options = (
get_images,
get_foo,
create_servers
)

最佳答案

您的代码非常好。您没有必须拥有 __init__ 方法。

您仍然可以使用 __init__,即使使用 ABC。 ABC 元测试的所有内容是 names 是否已定义。在 __init__ 中设置 images 确实需要您定义一个类属性,但您可以首先将其设置为 None:

class Servers(BaseMenu):

menu_name = "Servers"
images = None
foo = None

def __init__(self):
self.images = list_images.get_images()
self.foo = list_list.get_list()

现在您可以在 ABC 上设置约束,要求 images 抽象属性可用; images = None 类属性将满足该约束。

关于不使用 def __init__(self) 的 Python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17331126/

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