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

2024-10-04 05:33:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我为我的家庭作业创建了这个类:

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

我想我在写作课上做错了什么,但我不知道我到底做错了什么,你能帮我吗

编辑: 当我将isim变量放入definit时,我的代码工作正常,但它看起来很奇怪

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")

Tags: selfinitdefclassarprintbaisim
3条回答

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

您需要使用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

错误不在于你分配东西的方式,而在于你访问它们的方式

正如您必须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而不是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__方法之后添加数据。或者,更确切地说,您需要知道如何访问该数据,因为您已经正确地添加了它

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

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

有关类属性与实例属性的更深入讨论,请参见this answer,其中总结了this post

相关问题 更多 >