Clanton
Clanton

Reputation: 15

TypeError: 'tuple' object is not callable when trying to call method

Here is what I have going on so far:

# -*- coding: cp1252 -*-
import time

class Item():
    def __init__(self, name, description, base_value):
        self.name = name
        self.description = description
        self.ingredients = ingredients
        self.base_value = value
    def __str__(self):
        return format(self.name, self.description, self.ingredients, self.base_value)


class Metal(Item):
    def __init__(self, name, description, ingredients, base_value):
        self.smelt_time = smelt_time
        self.smelted = smelted
    def __str__(self):
        return format(self.name, self.description, self.ingredients, self.base_value, self.smelt_time, self.smelted)

class Bronze_Ingot(Metal):
    def __init__(self):
        self.name = "Bronze Ingot",
        self.description = "A refined ingot of bronze."
        #self.ingredients = Tin_Ore(1)+Copper_Ore(1) <--- I will get these lines working later...
        self.base_value = 33
        self.smelt_time = 15
        self.smelted = ()            

class Fuel(Item):
    def __init__(self, name, description, ingredients, base_value):
        self.fuel_time = fuel_time
    def __str__(self):
        return format(self.name, self.description, self.ingredients, self.base_value, self.fuel_time)

class Cloth(Fuel):
    def __init__(self):
        self.name = "Cloth",
        self.description = "A piece of cotton cloth."
        #self.ingredients = 2 Cotton <--- I will get these lines working later... 
        self.base_value = 2
        self.fuel_time = 5

But I am having great trouble with this function...

    def smelted(Fuel, Metal):
        if (Fuel.fuel_time - Metal.smelt_time) > 0:
            time.sleep(1)
            print "Smelting", Metal.name, "..."
            time.sleep(Metal.smelt_time)
            print "Time to forge!"

The problem is more or less making it work. My friend and I have tried EVERYTHING that we can think of when running this function, but to no avail. Here is our most recent attempt:

from Smelting_Progress import *

x = Cloth()
y = Bronze_Ingot()

y.smelted(x,y)

After trying to run this, I received this error:

Traceback (most recent call last):
File "C:\Users\WCS-HSSTUDENT\Desktop\Files\Project SAOffline\Coding\New Aincrad World\Items\NAI_Smelted.pyw", line 6, in <module>
    Metal.smelted(Fuel, Metal)
TypeError: 'tuple' object is not callable

Upvotes: 1

Views: 21093

Answers (1)

Martijn Pieters
Martijn Pieters

Reputation: 1123240

You have an instance attribute smelted; you set it in Metal.__init__():

self.smelted = smelted

Your Bronze_Ingot subclass sets it to an empty tuple:

self.smelted = ()            

You cannot have both a method and and a tuple use the same name. Rename one or the other.

If you meant to use your smelted() code as a function, then define it at the top level (same indentation as your classes), and call it as a function, not a method:

smelted(x, y)

(note, no y. in front).

Upvotes: 5

Related Questions