Pythonic在python 2.7.6中创建类的方法

时间:2013-11-29 20:48:55

标签: function class python-2.7 methods

我已经定义了一个模块来处理几种类型的数据文件(例如filetypes.py)。在其中我定义了一个基类来处理文件打开和一些基本处理,这些处理由特定于每种类型的数据文件的其余类继承。在每个类中,我使用__init __()方法初始化一些类变量,另一个方法用于读取具有文件名输入的数据文件(此操作不能在__init __()方法中完成)。类似的东西:

class maintype(object):
    """main type class.""
    def __init__(self):
        self.a = 1

class filetype1(maintype):
    """file type 1 class."""
    def __init__(self):
        self.b = 1

    def readfile(self, filename):
        self.ifile = open(filename, 'rb')

从主代码调用此模块时,感觉不自然:

import filetypes

data = filetypes.filetype1()
data.readfile('some_file_name')

问题:在模块中定义一个返回类而不是使用类方法的函数会不会更加pythonic?类似的东西:

def file_type1(filename):
    class1 = filetype1()
    class1.readfile(filename)
    return class1

现在,它看起来像:

import filetypes

data = filetypes.file_type1('some_file_name')

我在网上搜索过,找不到任何有用的指示......

1 个答案:

答案 0 :(得分:0)

不,a=A()其中A是一个类是“pythonic”方式,__init__已经是一个函数。

例如,如果你扩展一个类但不调用基类“__init__”,你就可以得到它们的函数。

顺便说一下,你可以将东西传递给构造函数。

例如:

class A(object):
     def __init__(self,extra):
          print("Look, extra: ",extra)

我认为OP是一个不知道构造函数是什么的tard / noob,对不起,这是一个更好的答案:

这是一个面向对象的东西,一个函数可以做但你希望它以某种方式属于你的类,你可以把它们放在同一个python包中,或者静态方法。如果我有一个复数类,我会使共轭成为一个静态方法,因为它属于复数,但是我会把一些使用复数的东西,但对外面所有复数都不重要。

假设我有__str__函数,显然会进入内部,因为每个复数都可以执行此操作。假设我有一个“输入两个数字”函数,它打印出用户输入的复数,即碰巧使用复数的函数,因此不是静态方法或方法。

这是我的例子:

#! /usr/bin/python

class reading_thing_maybe(object):
    def __init__(self,filename=None):
        #usual constructor code
        print "\tConstructor!"

        if not filename is None:
            print "\tSpecial case, constructing but doing readfile right away!"
            self.readfile(filename)

    def readfile(self,filename):
        print "\tReding file:",filename

class other_reading_thing(object):
    def __init__(self):
        print "\tConstructor"

    def readfile(self,filename):
        print "\tReding file:",filename

    @staticmethod
    def read_from_file(filename):
        print "\tconstructing with a read from",filename
        result = other_reading_thing()
        result.readfile(filename)
        return result

if __name__ == "__main__":
    print "normal"
    a = reading_thing_maybe()
    print "assuming constructor takes nothing"
    b = reading_thing_maybe("hello")
    print "using the filename= format"
    c = reading_thing_maybe(filename="use me if constructor takes arguments")
    print "Static method"
    d = other_reading_thing.read_from_file("test")

输出:

alec@ATLaptop ~ $ chmod +x ./example.py 
alec@ATLaptop ~ $ ./example.py 
normal
    Constructor!
assuming constructor takes nothing
    Constructor!
    Special case, constructing but doing readfile right away!
    Reding file: hello
using the filename= format
    Constructor!
    Special case, constructing but doing readfile right away!
    Reding file: use me if constructor takes arguments
Static method
    constructing with a read from test
    Constructor
    Reding file: test
alec@ATLaptop ~ $