Python: проблема с перегруженными конструкторами - PullRequest
7 голосов
/ 23 ноября 2008

ВНИМАНИЕ: я изучаю Python все 10 минут, поэтому извиняюсь за любые глупые вопросы!

Я написал следующий код, однако получаю следующее исключение:

Файл сообщения Имя Строка Расположение Узел трассировки 31 exceptions.TypeError: этот конструктор не принимает аргументов

class Computer:

    name = "Computer1"
    ip = "0.0.0.0"
    screenSize = 17


    def Computer(compName, compIp, compScreenSize):
        name = compName
        ip = compIp
        screenSize = compScreenSize

        printStats()

        return

    def Computer():
        printStats()

        return

    def printStats():
        print "Computer Statistics: --------------------------------"
        print "Name:" + name
        print "IP:" + ip
        print "ScreenSize:" , screenSize // cannot concatenate 'str' and 'tuple' objects
        print "-----------------------------------------------------"
        return

comp1 = Computer()
comp2 = Computer("The best computer in the world", "27.1.0.128",22)

Есть мысли?

Ответы [ 8 ]

36 голосов
/ 23 ноября 2008

Я собираюсь предположить, что вы пришли из Java-иша, поэтому есть несколько ключевых отличий, на которые следует обратить внимание.

class Computer(object):
    """Docstrings are used kind of like Javadoc to document classes and
    members.  They are the first thing inside a class or method.

    You probably want to extend object, to make it a "new-style" class.
    There are reasons for this that are a bit complex to explain."""

    # everything down here is a static variable, unlike in Java or C# where
    # declarations here are for what members a class has.  All instance
    # variables in Python are dynamic, unless you specifically tell Python
    # otherwise.
    defaultName = "belinda"
    defaultRes = (1024, 768)
    defaultIP = "192.168.5.307"

    def __init__(self, name=defaultName, resolution=defaultRes, ip=defaultIP):
        """Constructors in Python are called __init__.  Methods with names
        like __something__ often have special significance to the Python
        interpreter.

        The first argument to any class method is a reference to the current
        object, called "self" by convention.

        You can use default function arguments instead of function
        overloading."""
        self.name = name
        self.resolution = resolution
        self.ip = ip
        # and so on

    def printStats(self):
        """You could instead use a __str__(self, ...) function to return this
        string.  Then you could simply do "print(str(computer))" if you wanted
        to."""
        print "Computer Statistics: --------------------------------"
        print "Name:" + self.name
        print "IP:" + self.ip
        print "ScreenSize:" , self.resolution //cannot concatenate 'str' and 'tuple' objects
        print "-----------------------------------------------------"
5 голосов
/ 23 ноября 2008

Конструкторы в Python называются __init__. Вы также должны использовать «self» в качестве первого аргумента для всех методов вашего класса и использовать его для установки переменных экземпляра в классе.

class Computer:

    def __init__(self, compName = "Computer1", compIp = "0.0.0.0", compScreenSize = 22):
        self.name = compName
        self.ip = compIp
        self.screenSize = compScreenSize

        self.printStats()

    def printStats(self):
        print "Computer Statistics: --------------------------------"
        print "Name:", self.name
        print "IP:", self.ip
        print "ScreenSize:", self.screenSize
        print "-----------------------------------------------------"


comp1 = Computer()
comp2 = Computer("The best computer in the world", "27.1.0.128",22)
4 голосов
/ 23 ноября 2008

чувак, возьми себе книгу с питоном. Погружение в Python довольно хорошо.

2 голосов
/ 23 ноября 2008

Есть несколько вещей, на которые следует обратить внимание:

  1. Все методы экземпляра в Python имеют явный аргумент self.
  2. Конструкторы называются __init__.
  3. Вы не можете перегружать методы. Вы можете добиться аналогичного эффекта, используя аргументы метода по умолчанию.

C ++:

class comp  {
  std::string m_name;
  foo(std::string name);
};

foo::foo(std::string name) : m_name(name) {}

Python:

class comp:
  def __init__(self, name=None):
    if name: self.name = name
    else: self.name = 'defaultName'
2 голосов
/ 23 ноября 2008

Для начала посмотрите здесь .

1 голос
/ 13 января 2009

Python не поддерживает перегрузку функций.

1 голос
/ 23 ноября 2008

Ах, это обычные ошибки для новых разработчиков Python.

Сначала конструктор должен называться:

__init__()

Ваша вторая проблема - забыть включить параметр self в ваши методы класса.

Кроме того, когда вы определяете второй конструктор, вы заменяете определение метода Computer (). Python чрезвычайно динамичен и позволит вам переопределить методы класса.

Более питонным способом, вероятно, является использование значений параметров по умолчанию, если вы не хотите, чтобы они были обязательными.

1 голос
/ 23 ноября 2008

Это недопустимый питон.

Конструктор для класса Python - def __init__(self, ...):, и вы не можете его перегрузить.

Что вы можете сделать, это использовать значения по умолчанию для аргументов, например.

class Computer:
    def __init__(self, compName="Computer1", compIp="0.0.0.0", compScreenSize=17):
        self.name = compName
        self.ip = compIp
        self.screenSize = compScreenSize

        self.printStats()

        return

    def printStats(self):
        print "Computer Statistics: --------------------------------"
        print "Name      : %s" % self.name
        print "IP        : %s" % self.ip
        print "ScreenSize: %s" % self.screenSize
        print "-----------------------------------------------------"
        return

comp1 = Computer()
comp2 = Computer("The best computer in the world", "27.1.0.128",22)
...