我被指示定义一个带有3个变量的类:(看起来像这样)
class random(object):
def __init__(self,a,b,c):
self.a=a
self.b=b
self.c=c
self.result= #calculations with a,b and c.
def __str__(self):
#functions so that self.result prints correctly
但是,我还必须在上面的类中编写另一个函数:
def read(#takes whatever parameter I need)
#functions which I dont know how to write
这个函数应该允许我从另一个文件中读取(让我们称之为file.txt“),并将self.a,self.b和self.c替换为该文件中的信息,如果你知道我的意思吗?例如:
itemA=random(1,2,3)
和file.txt包含三行:
6
7
8
运行以下内容:
itemA.read()
假设将参数中的1,2,3替换为6,7,8,那么
itemA=random(6,7,8)
我怎样才能实现这一目标?我已经编写了读取和重现随机(6,7,8)的部分,其中包含:
fileHandle=open('file.txt', 'r')
fileHandle.readlines()
#some codes that turn string into integer/floats
fileHandle.close()
random(#put integers in)
然而,如果不手动编写,我无法将itemA从随机(1,2,3)更新为随机(6,7,8):
itemA=itemA.read() #in python shell
btw itemA只是一个示例名称,它可以命名为任何东西,所以我不能在我的计算中实际使用itemA ...
答案 0 :(得分:2)
在您的课程中,您可以通过在self
上设置属性来操纵属性,就像在__init__
方法中一样。
然后您需要做的就是在阅读后设置这些属性。您可能希望read()
方法也采用文件名:
def read(self, filename):
with open(filename) as fh:
self.a = int(fh.readline())
self.b = int(fh.readline())
self.c = int(fh.readline())
self.result = # same calculation
因此,当您致电itemA.read()
时,它会改变的属性;没有必要在这里退货。
您可以重用 __init__
方法来设置这些属性,并避免重复self.result
属性的计算:
class random(object):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
self.result = #calculations with a,b and c.
def read(self, filename):
with open(filename) as fh:
a = int(fh.readline())
b = int(fh.readline())
c = int(fh.readline())
self.__init__(a, b, c) # set the attributes plus result
或者您可以在__init__
和read()
之间共享单独的方法:
class random(object):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
self._calculate_result()
def _calculate_result(self)
self.result = #calculations with self.a, self.b and self.c.
def read(self, filename):
with open(filename) as fh:
self.a = int(fh.readline())
self.b = int(fh.readline())
self.c = int(fh.readline())
self._calculate_result() # set the result
它的工作原理如下:
itemA = random(1, 2, 3)
itemA.read('file.txt')
# now itemA.a is set to 4, itemA.b is set to 5 and item.c is set to 6
通过提供random
,a
和b
可能您希望生成类c
的实例>通过读取文件直接,或。这有点高级,但这意味着您提供了两种不同的工厂方法,这两种方法可以生成random
的实例。我倾向于使用类方法来实现额外的工厂方法:
class random(object):
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
self.result = #calculations with a,b and c.
@classmethod
def from_file(self, filename):
with open(filename) as fh:
a = int(fh.readline())
b = int(fh.readline())
c = int(fh.readline())
return cls(a, b, c) # create a new instance of this class
我将read
方法重命名为from_file()
,以更好地记录这是一种工厂方法。你会这样使用它:
itemA = random(1, 2, 3)
itemB = random.from_file('file.txt')
这会创建两个单独的实例,一个直接提供值,另一个通过读取文件。