Не повредит. Вы можете даже вызвать функцию с меньшим количеством параметров, чем требуется, если код функции в порядке с несколькими неопределенными значениями.
Вместо bar
используйте self.bar
или Foo.bar
. Присвоение Foo.bar
создаст статическую переменную, а присвоение self.bar
создаст переменную экземпляра.
class Foo(object):
bar = 1
def bah(self):
print Foo.bar
f = Foo()
f.bah()
Как и во всех хороших примерах, вы упростили то, что вы на самом деле пытаетесь сделать. Это хорошо, но стоит отметить, что python имеет гибкость , когда дело доходит до переменных класса и экземпляра. То же самое можно сказать о методах. Для хорошего списка возможностей я рекомендую прочитать введение новых классов в стиле Michael Fötsch , особенно разделы с 2 по 6.
Одна вещь, которая требует много работы, чтобы помнить, когда начало работы заключается в том, что python не является java. Больше, чем просто клише. В java компилируется весь класс, что делает разрешение пространства имен реальным простым: любые переменные, объявленные вне метода (в любом месте), являются переменными экземпляра (или, если статические, классные) и неявно доступны в методах.
С помощью python главное правило состоит в том, что для переменных есть три пространства имен:
{begin pedagogy}
Есть исключения для этого. Главное, что происходит со мной, заключается в том, что при загрузке определения класса определение класса является его собственным неявным пространством имен. Но это продолжается только до тех пор, пока модуль загружается и полностью исключается, когда внутри метода. Таким образом:
>>> class A(object):
foo = 'foo'
bar = foo
>>> A.foo
'foo'
>>> A.bar
'foo'
, но:
>>> class B(object):
foo = 'foo'
def get_foo():
return foo
bar = get_foo()
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
class B(object):
File "<pyshell#11>", line 5, in B
bar = get_foo()
File "<pyshell#11>", line 4, in get_foo
return foo
NameError: global name 'foo' is not defined
{end pedagogy}
В конце концов, нужно помнить, что вы / g2] имеют доступ к любой из переменных, к которым вы хотите получить доступ, но, вероятно, неявно. Если ваши цели просты и понятны, то для Foo.bar или self.bar, вероятно, будет достаточно. Если ваш пример становится более сложным или вы хотите делать причудливые вещи, такие как наследование (вы можете наследовать методы static / class!), Или идея ссылаться на имя вашего класса внутри самого класса кажется вам неправильной, проверьте интро я связал.
Определить метод класса:
class Foo(object):
bar = 1
@classmethod
def bah(cls):
print cls.bar
Теперь, если bah()
должен быть методом экземпляра (т. е. иметь доступ к self), вы все равно можете напрямую обращаться к переменной класса.
class Foo(object):
bar = 1
def bah(self):
print self.bar