Python и классы - PullRequest
       1

Python и классы

1 голос
/ 24 декабря 2010

Как я могу позвонить first.TQ в Second?Без создания объекта First in Second.

class First:
    def __init__(self):
        self.str = ""
    def TQ(self):
        pass
    def main(self):
        T = Second(self.str) # Called here
class Second():
    def __init__(self):
        list =  {u"RANDINT":first.TQ} # List of funcs maybe called in first
        .....
        .....
        return data

Ответы [ 4 ]

1 голос
/ 24 декабря 2010

Чтобы прояснить некоторые ответы, уже опубликованные здесь, так как я не думаю, что какой-либо из них действительно ясно указывает на это:

Обычно, когда вы определяете метод для класса в Python, он автоматически получаетпередал в качестве первого параметра экземпляр, для которого он вызывается.Если вы не хотите, чтобы это происходило, вы можете сделать две вещи:

  1. Использовать декоратор @staticmethod, который передаст no дополнительный аргументфункция (то есть; она будет вызываться с теми аргументами, с которыми она выглядит так, как будто она должна быть вызвана).Это не часто полезно, поскольку обычно проще определить глобальную функцию и не беспокоиться о пространстве имен класса.

  2. Использовать декоратор @classmethod, который пропустит class , в котором функция определена вместо self в качестве первого аргумента.(Этот аргумент условно называется cls.) Они часто используются для функций, которые применяются к классу в целом, скажем, from_string или некоторым другим.


Интересно почему вы хотите это сделать;может быть, есть лучший способ!

1 голос
/ 24 декабря 2010

Если вы хотите вызвать метод без создания объекта класса, вам нужно создать статический метод if.Используйте для этого декоратор staticmethod .Но имейте в виду, что статические методы не принимают параметр self, поэтому вы не можете использовать self!

class First:
    @staticmethod
    def some_method():
        print 'First.some_method()'
class Second:
    def __init__(self):
        First.some_method()

s = Second()

В опубликованном примере у вас уже есть объектFirst, так как вы находитесь в First.main().Таким образом, вы можете передать класс Первого self на Second:

class First:
    def main(self):
        second = Second(self) # we pass the current object...
    def do_something(self):
        print 'First.do_something()'
class Second:
    def __init__(self, first): # and recieve it as first
       first.do_something()
1 голос
/ 24 декабря 2010
class First:
    def __init__(self):
        self.str = ""

    @classmethod
    def TQ(self):
        pass

    def main(self):
        T = Second(self.str) # Called here

class Second():
    def __init__(self):
        list =  {u"RANDINT":First.TQ} # List of funcs maybe called in first
        .....
        .....
        return data

Только если вы не собираетесь вызывать метод TQ из экземпляра First. Удачного кодирования.

1 голос
/ 24 декабря 2010

Вам нужно сделать метод TQ статичным. После быстрой проверки в Google (я не слишком знаком с Python) я нашел это: http://code.activestate.com/recipes/52304-static-methods-aka-class-methods-in-python/

Кажется, это ответ на твой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...