长话短说,我需要编写一个主要使用OOP原则的数据分析工具。我不是python的初学者,但仍然不是最好的。我写了一个函数,根据用户输入的内容(下面)返回true或false值:
def secondary_selection():
"""This prints the options the user has to manipulate the data"""
print("---------------------------")
print("Column Statistics [C]")
print("Graph Plotting [G]")
d = input(str("Please select how you want the data to be processed:")).lower()
# Returns as a true/false boolean as it's easier
if d == "c":
return True
elif d == "g":
return False
else:
print("Please enter a valid input")
这个函数按照我想要的方式工作,但我尝试将它导入到不同的文件中以便与类一起使用(下面):
class Newcastle:
def __init__(self, data, key_typed):
self.data = data[0]
self.key_typed = key_typed
def newcastle_selection(self):
# If function returns True
if self:
column_manipulation()
# If function returns False
if not self:
graph_plotting()
newcastle_selection(self)
函数将secondary_selection()
函数作为参数,但我使用它的唯一方法是if self
语句。写if true
之类的内容会导致打印column_manipulation
和graph_plotting
函数。
我想知道是否有更好的方式来写这个,因为我不是python的初学者,但仍然相对较新。
免责声明:这是第一年的课程,我问这是最后的结果。
答案 0 :(得分:0)
这是使用class的 secondary_selection 方法的简单基本示例。这可能会有所帮助。
class castle:
def __init__(self):
self.data = ''
def get_input(self):
print("1: Column Statistics")
print("2: Graph Plotting")
self.data = input("Please select how you want the data to be processed: ")
def process(self):
if self.data == 1:
return self.column_manipulation()
else:
return self.graph_plotting()
def column_manipulation(self):
return True
def graph_plotting(self):
return False
c = castle()
c.get_input()
result = c.process()
print(result)
答案 1 :(得分:0)
我不确定我是否已经很好地理解了您的代码结构,但它似乎有点factory可以帮助您:
allcoursetimeobject = {
test1 : {
hours : 3,
days : 4,
something : 3,
},
test2 : {
hours : 3,
days : 4,
somethingElse : 5,
}
}
Object.keys(allcoursetimeobject).forEach(function(key) {
Object.keys(allcoursetimeobject[key]).forEach(function(secondKey){
if(allcoursetimeobject[key][secondKey] !== allcoursetimeobject[key].hours && allcoursetimeobject[key][secondKey] !== allcoursetimeobject[key].days){
delete allcoursetimeobject[key][secondKey];
}
});
});
console.log(allcoursetimeobject);
输出
def column_manipulation():
print("Column manipulation")
def graph_plotting():
print("Graph plotting")
class Newcastle:
def __init__(self, data, func):
self.data = data[0]
self._func = func
def newcastle_selection(self):
return self._func()
@classmethod
def factorize(cls, data, key_typed):
if key_typed is True:
return cls(data, column_manipulation)
elif key_typed is False:
return cls(data, graph_plotting)
else:
raise TypeError('Newcastle.factorize expects bool, {} given'.format(
type(key_typed).__name__
))
nc = Newcastle.factorize(["foo"], True)
nc.newcastle_selection()
nc = Newcastle.factorize(["foo"], False)
nc.newcastle_selection()
主要想法是以通用方式定义您的类,因此您将Column manipulation
Graph plotting
作为function
参数存储在__init__
中,并在self._func
中调用它。
然后,您创建一个newcastle_selection
来获取您的数据& classmethod
。此方法负责选择将哪个函数(key_typed
或column_manipulation
)用于当前实例。
因此,您不要在班级中存储像graph_plotting
这样无用的值,也不必在任何地方处理特定情况,只能在key_typed
中。
我认为更清洁和强大(并且它回答了你的问题“这是pythonic ”,这是)。