找不到对象实例

你好,
我是一个新手.
我遇到了两个对象实例
modulea.py
----------------------------
导入模块
Myclassa班:
def __init __(自我):
self.age = 0
self.address =''
def createClassB(self):
self.objb = moduleb.myClassB()
DEF验证(自我,年龄,地址):
如果(年龄> = 100或地址==''):
self.age = 20;
self.address ="百老汇,纽约"
self.objb.display(self.age,self.address)
def callb(self):
self.objb.execute()
如果__name__ ==" __ -main __":
obja = myclassa()
obja.createclassb()
obja.callb()
Moduleb.py
------------------------
导入模块
MyClassB类:
def __init __(自我):
self.createa()
def createa(self):
self.obja = modulea.myclassa()
def execute(self):
self.obja.Validate(111,'')
def显示(自我,年龄,地址):
打印"显示:",str(年龄),地址
当我运行代码时,我会收到一条消息
attributeError:myClassa实例没有属性" objb"
我是否必须在myclassa的__init__中为OBJB放置一个占位符?
这就是为什么我会遇到这个错误吗?有人请告诉我我如何解决
这个?我试图将self.objb = none but.objb =不起作用..(我是
思考Java样式objb = null)
请帮忙
谢谢
吉姆

# 回答1


Jimgardener aécrit:
从我从您的代码中看到的内容,您是新手到编程
一般的...
第一点:您既有模块之间的循环依赖性
模块 - 最好避免,除非您真的很喜欢头痛...
您在其他地方提到Java,所以我认为您至少有一些
Java背景.这是Python不是Java,也不是
将您限制为每个模块的一个("公共")类. IOW,如果您有两个
密切相关的班级(在这里显然是这种情况),最好
将两个都放在同一模块中.
为什么这是一种独特的方法而不是在初始化器中?
当它创建*实例*时,为什么它命名为创建* class*?
看起来有些混乱,卷积和任意
过于复杂的控制流...
您确实知道self.obja不会像
实现MyClassB实例的一个,对吗?
您不必在这里年龄打电话.
的确.
您首先创建一个名为obja的myclassa实例,请致电createclassb()
在其上创建一个由obja.objb引用的myclassb实例.
当创建obja.objb时,它本身创建了另一个实例
obja.objb.obja引用的myclassa,这完全不同于
obja ...
然后您致电obja.callb(),
它本身称为obja.objb.execute(),
依次致电obja.objb.obja.validate(),
依次致电obja.objb.obja.objb.display().
但是在这一点上,obja.objb.obja(我重复一遍, *不是 * obja)
没有属性OBJB,因为您没有致电obja.objb.obja.createclassb()...
您本可以自己理解这一点,要么像我这样做
(精神跟踪程序执行)或使用几个打印语句
在您的代码中(有效地跟踪程序执行)或使用
调试器...

尝试任何 想到的而不是试图了解如何
事情工作是一个著名的反对者,名为"偶然编程".
从这种方法中,您可以希望的最好的是,出于未知原因,
事情偶然起作用.直到那天,仍然未知
原因,他们要么停止工作,要么看来他们从来没有真正
完全工作.
不用说,这种方法纯粹是浪费时间.

类班级(对象):
def __init __(自我,年龄= 0,地址=''):
self.age =年龄
self.address =地址
self.b = classB(self)
DEF验证(自我,年龄,地址):
如果(年龄> = 100或地址==''):
self.age = 20;
self.address ="百老汇,纽约"
self.b.display(self.age,self.address)
def call_b(self):
self.b.execute()
classB(对象):
def __init __(self,a):
self.a = a
def execute(self):
self.a.validate(111,'')
def显示(自我,年龄,地址):
打印'显示:%s%s'%(年龄,地址)
如果__name__ ==" __ -main __":
obja = classa()
obja.call_b()
请注意,这仍然是毫无用力的凌乱和任意的
过于复杂的...在两个类之间的这种乒乓球通常是
而不是设计气味.
hth
# 回答2


Jimgardener写道:
不要那样做.循环进口是代码气味.如果两个模块是
再加上那条紧身,通常是您只需要一个模块或
将某些东西分解为第三个模块,这两个模块都是由两个旧导入的
模块.
再见,
marc'blackjack'rintsch
# 回答3


8月28日,晚上9:35,Bruno Desthuilliers 42.desthuilli ...@werfeburburo.invalidwrote:
这两个类之间的这样的乒乓球通常是
谢谢布鲁诺,我理解我的错误..应该弄清楚了

再次感谢
吉姆

标签: python

添加新评论