我为我的家庭作业创建了这个类:
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")
Normall
__init__(..)
用于初始化/实例化实例。我不会打印它,也不会计算(除非你计算一些其他类变量并设置它们)您需要使用
self.
作为实例变量的前缀,并使用类名作为静态类变量的前缀来访问它:输出:
错误不在于你分配东西的方式,而在于你访问它们的方式
正如您必须
self.bSayisi
设置属性一样,您也必须self.isim
访问一个属性。所以:(另一行也一样…)
如果您想知道为什么您能够访问其他值,如
bSayisi
,而不使用self.bSayisi
,那只是因为您碰巧有一个名为bSayisi
的参数,它恰好与self.bSayisi
具有相同的值(因为您刚才几行就实现了这一点)。如果您将其更改为self.bSayisi = bSayisi*2
,或者将参数重命名为myBSayisi
,并执行了self.bSayisi = myBSayisi
,您会发现仅仅使用bSayisi
而不是self.bSayisi
不再正确然而,虽然这消除了错误,但我不确定它是否真的符合您的要求。在执行这个
print
时,还没有为对象指定isim
值,所以它将获得类值作为默认值,所以它总是" "
。那真的是你想要的吗如果没有,则需要将
print
调用移动到其他方法,在分配了isim
之后,可以稍后调用这些方法。例如:当然,将
isim
移到构造函数中可以避免遇到的问题。当然,这不是如何在__init__
方法之后添加数据的答案,因为您将在__init__
方法中添加数据。如果合适的话,这是最简单的答案但如果在这种情况下看起来很奇怪(我相信你的话;我不知道这段代码到底想做什么),这可能是这个特定类的错误答案
在这种情况下,您确实需要知道如何按照要求在
__init__
方法之后添加数据。或者,更确切地说,您需要知道如何访问该数据,因为您已经正确地添加了它这就是类属性和实例属性之间的区别(当类属性在
__init__
之外,没有self.
)和实例属性(当您使用self.
将其添加到__init__
内部时)类属性稍微复杂一点,因为它们属于该类的所有实例(您可以在某些实例中覆盖它们,但在这些情况下它们将成为实例属性)。。。因此,如果您更改了一个类属性,它将影响您可能已经创建或将来将要创建的所有其他实例
有关类属性与实例属性的更深入讨论,请参见this answer,其中总结了this post
相关问题 更多 >
编程相关推荐