如何替换python类中的变量?

如何替换python类中的变量?,python,class,replace,instance,Python,Class,Replace,Instance,我被要求定义一个包含3个变量的类:(看起来像这样) 但是,我还必须在上面的类中编写另一个函数: 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) 和

我被要求定义一个包含3个变量的类:(看起来像这样)

但是,我还必须在上面的类中编写另一个函数:

    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)
我怎样才能做到这一点?我已经写了读和复制random(6,7,8)的部分,其中包括:

但是,如果不手动写入,我无法将itemA从random(1,2,3)更新为random(6,7,8):

itemA=itemA.read() #in python shell

顺便说一句,itemA只是一个示例名称,它可以被命名为任何名称,因此我不能在计算中实际使用itemA…

在类的方法中,您可以通过将属性设置为
self
,就像您在
\uu init\uu
方法中所做的那样来操作属性

然后,您需要做的就是在读取后设置这些属性。您可能希望您的
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()
时,它将在适当的位置更改属性;这里不需要返回任何内容

您可以重用
\uuuu init\uuuu
方法来设置这些属性,并避免重复
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
或者您可以在
\uuu init\uuu
read()
之间共享一个单独的方法:

它的工作原理如下:

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
itemA = random(1, 2, 3)
itemB = random.from_file('file.txt')
您可能希望通过直接提供
a
b
c
,或者通过读取文件来生成类
random
的实例。这稍微高级一点,但这意味着您提供了两种不同的工厂方法,两种不同的方法来生成
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)
itemA.read('file.txt')
# now itemA.a is set to 4, itemA.b is set to 5 and item.c is set to 6
itemA = random(1, 2, 3)
itemB = random.from_file('file.txt')

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

您应该提到,
random
对于自己的类来说是个坏名字。@Matthias:
random
不是内置的。当然,它可能会与标准库模块冲突,但只有当您将其作为全局模块导入时才会发生冲突。它是我在这儿。
itemA = random(1, 2, 3)
itemB = random.from_file('file.txt')