2017-10-29 5 views
0

여기에 슈퍼 클래스가 서브 클래스를 인쇄하고 정보에 대한 액세스를 갖는문제 제대로

class Item: 
    def __init__(self, name, desc, usable, value): 
     self.name = name 
     self.desc = desc 
     self.usable = usable 
     self.value = value 

    def __str__(self): 
     return "{}\n=====\n{}\nValue: {}\n".format(self.name, self.desc, self.usable, self.value) 

그리고 (다른 사람의 사이에서)이 서브 클래스 :

class HPot(Item): 
    def __init__(self): 
     super().__init__(desc="Heals for 5 HP.", 
         name="Health Potion", 
         usable=0, 
         value=3) 

IHpot = HPot 

이 그리고 그것은 Inv라는 목록입니다 :

Inv = [IHpot] 

그리고 내가 print(Inv) 일 때, 이것은 명백한 Y :

[<class 'items.HPot'>] 

그래서 나는이 코드를 만든 :

def openinv(): 
    print("Your inventory:") 
    print(', '.join(Inv)) 
    print("----------") 
    # [...] 

을 그리고 이런 :

Your inventory: 
Traceback (most recent call last): 
    File "C:/Users/Bernardo/PycharmProjects/EndlessDungeon/inventory.py", line 
29, in <module> 
    openinv() 
    File "C:/Users/Bernardo/PycharmProjects/EndlessDungeon/inventory.py", line 18, in openinv 
    print(', '.join(Inv)) 
TypeError: sequence item 0: expected str instance, type found 

Process finished with exit code 1 

내가 return "{}\n=====\n{}\nValue: {}\n".format(self.name, self.desc, self.usable, self.value)이 (가 Item 슈퍼 클래스에있다) 도움이 될 것으로 생각했지만, 온라인으로 시도하거나 검색 한 항목이 도움이되지 않았습니다. Health Potion처럼 인쇄하고 여전히 'name, desc, usable,'등의 클래스에 액세스 할 수 있습니까? 어떻게해야합니까?

+1

클래스 자체 또는 클래스 인스턴스를 인쇄하려고합니까? – Elazar

+0

나는 thess 용어에별로 좋지는 않지만, 내가 원하는 것은 클래스 자체를 인쇄하는 것이라고 생각한다. 마찬가지로 .usable, .value 등등에 접근 할 수있는 동안 클래스의 .name을 출력하십시오. – Bernardozomer

+1

이들은 클래스의 속성이 아니며 클래스에 존재하지 않습니다. 그것들은 클래스의 인스턴스의 속성입니다. – Elazar

답변

0

귀하의 재고가 클래스가 포함되어 있습니다,하지만 당신이 그 클래스의 인스턴스를 포함 할 것 같습니다 : 당신은 지능형리스트로, 예를 들어, 목록을 직접 변환해야합니다.

IHPot = HPot() 

그리고 openinv에 대한이 같은 str들에 Item 인스턴스의 각을 설정할 수 있습니다 :

IHPot = HPot 

해야 할 것 :

대신 당신이

def openinv(): 
    print("Your inventory:") 
    print(', '.join([str(i) for i in Inv])) 
    print("----------") 

요 전에 Item 클래스를 인스턴스화합니다. u는 인스턴스 메소드 (첫 번째 매개 변수가 self 인 메소드)를 사용할 수 있습니다.자세한 정보가 필요하면 "python class vs instance methods"를 검색하십시오.

2

서브 클래스 Hpot인스턴스을 생성하지 않았습니다. 파이썬에서는 모든 것이 클래스를 포함한 객체입니다. 그래서 라인을 쓸 때

IHpot = HPot 

HP34의 인스턴스를 만들지 않으면 클래스 자체의 두 번째 이름을 만듭니다.

인스턴스를 만들려면 클래스를 함수처럼 호출해야합니다.

IHpot = HPot() 

이 코드 라인은 사용자가 말한 모든 특성을 가진 HPot의 인스턴스를 생성합니다.

두 번째 문제가 있습니다. IHpot에는 __str__ 메서드가 있지만 str이 아닙니다. join 함수는 문자열로 변환 될 수있는 객체 목록이 아니라 문자열 목록을 필요로합니다.

InvAsStrings = [str(a) for a in Inv] 
+1

+1을 알고 있습니다. CamelCase (예 :'HPot')를 클래스 이름에만 사용하고 다른 변수를 위해서는'snake_case '를 사용하는 강력한 규약을 여기에서주의하는 것이 중요하다고 생각합니다. 혼동을 피하는 데 도움이됩니다. – Elazar