我遇到了一個奇怪的錯誤。對象功能無法識別的對象屬性[Python]
import socket
from string_message_converter import StringMessageConverter as SMC
from sbe_message_converter import SBEMessageConverter
from abstract_publisher import AbstractFoo
import config
class Foo(AbstractFoo):
def __init__(self, p_id):
self.sock = 1
self.p_id = p_id
def connect(self):
ttl = 2
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)
我有一個依賴於這個類的主要方法。當我運行connect()時,我得到一個NameError'全局名'sock'未定義'。但襪子不是全球性的;它是我在__init__中定義的屬性。奇怪的是,p_id不會發生同樣的錯誤。例如:
MulticastPublisher.py:
class Foo(AbstractFoo):
def __init__(self, p_id):
self.sock = 1
self.p_id = p_id
def connect(self):
ttl = 2
self.p_id = 2
print self.p_id
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)
將打印 '2' 的p_id(之前也對連接的self.sock仍將突破)。而且,我在不同的機器上運行相同的代碼,運行良好。爲什麼self.sock不被識別?
編輯:主要方法只是兩行。
testmain_pub.py
def main():
f = Foo()
f.start_process() #references connect method
堆棧跟蹤只是引用連接方法:
File "testmain_pub.py", line 21, in <module>
main()
File "testmain_pub.py", line 9, in main
m.publish_start("start message")
File "/home/observe_and_report/multicast_publisher.py", line 48, in publish_start
self.publish("start", message)
File "/home/observe_and_report/multicast_publisher.py", line 35, in publish
self.connect()
File "/home/observe_and_report/multicast_publisher.py", line 30, in connect
self.sock = socket.socket(sock.AF_INET, socket.SOCK_DGRAM)
你可以把完整的代碼示例包括主? –
完整的堆棧跟蹤也是非常有用的。 – user2357112
我相信錯誤是**全局名稱'套接字'未定義**,而不是** sock **。您需要在腳本的開頭添加一行說'import socket'的行。 –