AttributeError가 발생하는 이유 : Object has no attribute [closed]


82

MyThread 클래스가 있습니다. 그 안에 메서드 샘플이 있습니다. 동일한 개체 컨텍스트 내에서 실행하려고합니다. 코드를보세요 :

class myThread (threading.Thread):
    def __init__(self, threadID, name, counter, redisOpsObj):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
        self.redisOpsObj = redisOpsObj

    def stop(self):
        self.kill_received = True

    def sample(self):
        print "Hello"

    def run(self):
        time.sleep(0.1)
        print "\n Starting " + self.name
        self.sample()

매우 간단 해 보이지 않습니다. 하지만 실행하면이 오류가 발생합니다.

AttributeError: 'myThread' object has no attribute 'sample'이제 그 방법이 있습니다. 그래서 무엇이 잘못 되었나요? 도와주세요

편집 : 이것은 스택 트레이스입니다

Starting Thread-0

Starting Thread-1
Exception in thread Thread-0:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
self.run()
File "./redisQueueProcessor.py", line 51, in run
self.sample()
AttributeError: 'myThread' object has no attribute 'sample'

Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
self.run()
File "./redisQueueProcessor.py", line 51, in run
self.sample()
AttributeError: 'myThread' object has no attribute 'sample'

이렇게 부르고있어

arThreads = []
maxThreads = 2;

for i in range( maxThreads ):
    redisOpsObj = redisOps()
    arThreads.append( myThread(i, "Thread-"+str(i), 10, redisOpsObj) )

redisOps 수업 코드를 게시 할 수 없습니다. 하지만 잘 작동한다고 확신 할 수 있습니다.


콜 스택에 완전한 오류를 게시할까요?
sloth

전화하는 방법에 코드를 추가해 주시겠습니까?
Babu

2
누락 된 코드가 있습니까? 이 스 니펫은 나를 위해 잘 작동합니다.
ThirdOne 2012-07-27

2
정말 죄송합니다. 네, 내 들여 쓰기가 속였습니다. 파이썬의 완전히 초보자. 따라서 들여 쓰기의 중요성을 놓쳤을 수 있습니다.
Shades88 2012-07-27

파이썬 코딩하는 동안, 당신은 선택 코드 편집기에서 "탭과 공백을 표시"해야
vanduc1102

답변:


94

들여 쓰기가 엉망이고 탭과 공백이 섞여 있습니다. python -tt확인 하려면 스크립트를 실행하십시오 .


눈을 뜨게 해주셔서 감사합니다. 지금 알았습니다. 죄송합니다 바보 같은 질문과 같은 질문의 너무 긴 설명은)
Shades88

3
"확인을 위해 python -tt로 스크립트 실행"의 의미가 무엇인지 말씀해 주시겠습니까?
akshay_rahar

9
@akshay_rahar :python -tt script.py
Ignacio Vazquez-Abrams

1
그렇다면이 마법 매개 변수 -tt는 무엇을합니까? 나는 그것을 발견하지 않았습니다 문서
의 Łukasz Nojek에게

10
업데이트 : -ttPython 3에는 플래그가 없습니다. Python 2에있었습니다.
Łukasz

13

파이썬 3 이상을 사용하는 경우 이중 밑줄로 시작하는 개인 변수 (예 : self .__ yourvariable)를 사용하는 경우에도 발생할 수 있습니다. 이 문제에 부딪 힐 수있는 여러분 중 일부를 위해 유의해야 할 사항입니다.


PIP에 문서화되어 있습니까?
dashesy

1
문제가 발생하여이 의견을 찾았습니다. 왜 그렇게 설계했을까요?
matthewhang

1
여기에 문서화되어 있습니다. docs.python.org/3/tutorial/classes.html#private-variables
Mohit

12

이러한 종류의 버그는 Python 멀티 스레딩에서 흔히 발생합니다. 인터프리터 분해시 관련 모듈 ( myThread이 경우)이 일종의 del myThread.

이 호출 self.sample()은 대략 myThread.__dict__["sample"](self). 그러나 만약 우리가 인터프리터의 분해 순서에 있다면, 알려진 유형의 자체 사전이 이미 myThread삭제 되었을 수 있으며 이제는 기본적으로 NoneType-이고 '샘플'속성이 없습니다.


7

이는 클래스에서 슬롯 을 사용하고 슬롯 에이 새 속성을 아직 추가하지 않은 경우에도 발생할 수 있습니다 .

class xyz(object):
"""
class description

"""

__slots__ = ['abc', 'ijk']

def __init__(self):
   self.abc = 1
   self.ijk = 2
   self.pqr = 6 # This will throw error 'AttributeError: <name_of_class_object> object has no attribute 'pqr'

2

다중 스레딩 시나리오 (특히 ZMQ를 다룰 때)에 대해이 오류가 발생했습니다. 다른 스레드가 이미 데이터를 보내기 시작하는 동안 소켓이 여전히 한 스레드에 연결되어 있음이 밝혀졌습니다. 다른 스레드로 인해 발생한 이벤트가 아직 생성되지 않은 변수에 액세스하려고했습니다. 시나리오에 다중 스레딩이 포함되어 있고 약간의 지연을 추가하면 작동하는 경우 비슷한 문제가있을 수 있습니다.


1

Python은 클래스 이름을 포함하도록 이름을 내부적으로 변경하여 해당 멤버를 보호합니다. object._className__attrName과 같은 속성에 액세스 할 수 있습니다.


0

나도 같은 오류가 발생했습니다. 내 들여 쓰기에 문제가 없다고 확신합니다. 파이썬 판매를 다시 시작해야만 문제가 해결되었습니다.


다시 시작하라는 명령이나 무엇을했는지 게시 할 수 있습니다. 초보자에게 도움이 될 수 있습니다.
Khan

0

mythread라는 다른 변수가있을 때 동일한 오류가 발생했습니다. 그 변수가 이것을 덮어 써서 오류가 발생했습니다.


-3

클래스의 외부 비공개 필드에 액세스 할 수 없습니다. 개인 필드는 __로 시작합니다. 예를 들면-

class car:
    def __init__(self):
        self.__updatesoftware()

    def drive(self):
        print("driving")

    def __updatesoftware(self):
        print("updating software:")

obj = car()
obj.drive()  
obj.__updatesoftware()  ## here it will throw an error because 

__updatesoftware는 개인 메서드입니다.


3
저자는 사적인 방법에 접근하려고하지 않고, 질문도 6 년이 넘었고 이미 해결되었으므로 다시 대답 할 필요가 없습니다.
Johan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.