如何在python类中替换变量?

时间:2014-11-26 11:17:30

标签: python class replace instance

我被指示定义一个带有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 ...

1 个答案:

答案 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
通过提供randomab 可能您希望生成类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')

这会创建两个单独的实例,一个直接提供值,另一个通过读取文件。