我为我的作业创建了这个课程:
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")
答案 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 answer的this 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