在运行def __init __(self)函数后,如何在类对象中添加数据?

时间:2018-04-26 18:01:32

标签: python python-3.x class

我为我的作业创建了这个课程:

class sayfa():
    isim=" "
    def __init__(self,bSayisi,ySayisi,pSayisi,iSayisi,tSayisi):
        self.bSayisi=bSayisi
        self.ySayisi=ySayisi
        self.pSayisi=pSayisi
        self.iSayisi=iSayisi
        self.tSayisi=tSayisi
        if ((((bSayisi+ySayisi+pSayisi)/iSayisi)/tSayisi)*100)>0.2:
             print(isim,"başarılı")
        else:
             print(isim,"başarısız")

然后我在另一个.py文件中调用它:

from eRate import sayfa


ybs1=sayfa(365000,65000,870,500,1125000)
ybs1.isim="YBS-1"

然后我尝试了它,它给了我这个错误:

NameError: name 'isim' is not defined

我觉得我上课的时候做错了什么,但我不知道自己做错了什么。能帮助我吗?

编辑: 当我在def init 中放入isim变量时,我的代码工作,但它看起来很奇怪。它看起来像这样:

class sayfa():

    def __init__(self,bSayisi,ySayisi,pSayisi,iSayisi,tSayisi,isim):
        self.isim=str(isim)
        self.bSayisi=bSayisi
        self.ySayisi=ySayisi
        self.pSayisi=pSayisi
        self.iSayisi=iSayisi
        self.tSayisi=tSayisi
        if ((((bSayisi+ySayisi+pSayisi)/iSayisi)/tSayisi)*100)>0.2:
             print(isim,"başarılı")
        else:
             print(isim,"başarısız")

当我在课堂上添加数据时,它变得更奇怪了:

from eRate import sayfa


ybs1=sayfa(365000,65000,870,500,1125000,"YBS-1")

3 个答案:

答案 0 :(得分:1)

错误不在于您分配内容的方式,而在于您访问它们的方式。

正如您必须self.bSayisi 设置属性一样,您必须self.isim 访问一个。所以:

print(self.isim, "başarılı")

(和另一行相同......)

如果您想知道为什么在没有bSayisi的情况下能够访问self.bSayisi之类的其他值 - 那只是因为您碰巧有一个名为bSayisi的参数碰巧具有相同的值值为self.bSayisi(因为你之前只做了几行)。如果您将其更改为self.bSayisi = bSayisi*2,或者您将参数重命名为myBSayisi并执行self.bSayisi = myBSayisi,则会看到仅使用bSayisi代替{{1} }}不再正确。

然而,虽然这消除了错误,但我不确定它实际上是否符合您的要求。当你执行此操作self.bSayisi时,你还没有为对象分配print值,所以它会将类值作为默认值,所以它总是会成为isim。这真的是你想要的吗?

如果没有,您需要在" "分配print之后将isim次来电转移到稍后可以调用的其他方法。例如:

class sayfa():
    isim=" "
    def __init__(self,bSayisi,ySayisi,pSayisi,iSayisi,tSayisi):
        self.bSayisi=bSayisi
        self.ySayisi=ySayisi
        self.pSayisi=pSayisi
        self.iSayisi=iSayisi
        self.tSayisi=tSayisi
    def displaystuff(self):
        if ((((self.bSayisi+self.ySayisi+self.pSayisi)/self.iSayisi)/self.tSayisi)*100)>0.2:
             print(self.isim,"başarılı")
        else:
             print(self.isim,"başarısız")

ybs1=sayfa(365000,65000,870,500,1125000)
ybs1.isim="YBS-1"
ybs1.displaystuff()

当然,将isim移动到构造函数中可以避免遇到的问题。当然,这不是在__init__方法之后如何添加数据的答案,因为您改为在 __init__方法中添加数据。如果合适,这是最简单的答案。

但是如果在这种情况下它看起来很奇怪(我会接受你的话;我不知道这个代码到底要做什么),这可能是这个特定类的错误答案。

在这种情况下,您需要知道如何在__init__方法之后添加数据,如您所知。或者,您需要知道如何访问该数据 - 因为您已经正确添加了它。

答案 1 :(得分:1)

这是类属性之间的区别(当它在__init__之外而没有self.)和实例属性之间时(当你使用__init__将其添加到self.内。

类属性稍微复杂一些,因为它们属于该类的所有实例(您可以在某些实例中覆盖它们,但在那些情况下它们将成为实例属性)...所以如果您更改了class属性,它会影响您可能已创建或将来创建的所有其他实例。

有关类属性与实例属性的更深入讨论,请参阅总结this answerthis post

答案 2 :(得分:0)

Normall self.用于初始化/实例化您的实例。我不打印,也不计算(除非你计算一些其他类变量并设置它们)。

您需要为实例的变量添加前缀class sayfa(): isim=" " # this is a shared class variabl (aka static) def __init__(self,bSayisi,ySayisi,pSayisi,iSayisi,tSayisi): self.bSayisi=bSayisi # these are all instance variables, not shared self.ySayisi=ySayisi self.pSayisi=pSayisi self.iSayisi=iSayisi self.tSayisi=tSayisi self.unusedSum = ySayisi + pSayisi + iSayisi def printMe(self): # lookup __str__() and __repr__() for how to output your instance if ((((self.bSayisi+self.ySayisi+self.pSayisi)/self.iSayisi)/self.tSayisi)*100)>0.2: print(sayfa.isim,"some text") # use the static class variable else: print(sayfa.isim,"some other text") sayfa.isim = "Coffee " # you set static class variables by prefixing class name my_sayfa_instance = sayfa(365000,65000,870,500,1125000) other_sayfa_instance = sayfa(3600,65000,870,500,10) my_sayfa_instance.printMe() other_sayfa_instance.printMe() ,并使用类名称的静态类变量来访问它:

Coffee  some other text
Coffee  some text

输出:

col