Какое значение имеет функция без аргумента «я» в классе? - PullRequest
6 голосов
/ 26 декабря 2009
class a:
    def b():
        ...

Какое значение имеет b

спасибо


class a:
    @staticmethod    
    def b():
        return 1
    def c(self):
        b()

print a.b()
print a().b()
print a().c()#error

и

class a:
    @staticmethod    
    def b():
        return 1
    def c(self):
        return self.b()

print a.b()
print a().b()
print a().c()
#1
#1
#1

Ответы [ 3 ]

7 голосов
/ 26 декабря 2009

Обычно вы должны использовать b () в качестве статического метода, чтобы вы могли вызывать его из класса или объекта класса, например:

bash-3.2$ python
Python 2.6 (trunk:66714:66715M, Oct  1 2008, 18:36:04) 
[GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class a:
...    @staticmethod
...    def b():
...       return 1
... 
>>> a_obj = a()
>>> print a.b()
1
>>> print a_obj.b()
1
>>> 
4 голосов
/ 26 декабря 2009

Синтаксическая ошибка. Попробуйте позвонить.

>>> class a:
...     def b():
...             return 1
... 
>>> x=a()
>>> x.b()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: b() takes no arguments (1 given)

Смотри также:

>>> class a:
...     def b():
...             return 1
...     def c(self):
...             return b()
... 
>>> a().c()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in c
NameError: global name 'b' is not defined
1 голос
/ 26 декабря 2009

в методе класса self - это экземпляр класса, к которому вызывается метод. имейте в виду, что self - это не ключевое слово в python, а обычное имя, данное первому аргументу метода.

посмотрите на этот пример:

class A:

    def foo(self):
        print "I'm a.foo"

    @staticmethod
    def bar(s):
        print s

a = A()
a.foo()
A.foo(a)

здесь a - это экземпляр класса A. вызывая a.foo(), вы вызываете метод foo экземпляра a, в то время как A.foo(a) вызывает метод foo в классе A, но передает экземпляр a в качестве первого аргумента, и они в точности совпадают вещь (но никогда не используйте вторую форму).

staticmethod - это декоратор, который позволяет вам определять метод класса как статический. эта функция больше не является методом, и первый аргумент не является экземпляром класса, но является именно первым аргументом, который вы передали этой функции:

a.bar("i'm a static method")
i'm a static method
A.bar("i'm a static method too")
i'm a static method too

PS. я не хочу беспокоить вас, но это основа Python, Учебник Python - хорошее начало для начинающих.

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