我已经定义了一个模块来处理几种类型的数据文件(例如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')
我在网上搜索过,找不到任何有用的指示......
答案 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 ~ $