这是pythonic吗?类自变量

时间:2018-02-24 11:14:32

标签: python python-3.x oop

长话短说,我需要编写一个主要使用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_manipulationgraph_plotting函数。 我想知道是否有更好的方式来写这个,因为我不是python的初学者,但仍然相对较新。

免责声明:这是第一年的课程,我问这是最后的结果。

2 个答案:

答案 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_typedcolumn_manipulation)用于当前实例。

因此,您不要在班级中存储像graph_plotting这样无用的值,也不必在任何地方处理特定情况,只能在key_typed中。

我认为更清洁和强大(并且它回答了你的问题“这是pythonic ”,这是)。