Python » Страница 758

-

Программирование на Python



dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#7571

глобал в классе это кощунство. Попытаюсь кратко на пальцах объяснить.

class A:
def __init__(self):
self.x = 0
x = 1
a = A()
print a.x

выведет ноль.
Разберем, что происходит. Внутри класса в функции первый аргумент (по рекомендательному соглашению это имя self) это ссылка на экземпляр класса. Т.е. запись внутри функции инит self.x аналогична a.x за пределами класса, где a это созданный экземпляр класса A. Класс- это шаблон, экземпляров можно создать сколько угодно:
b = A()
b.x = 2
print (a.x, b.x)
выведет (0, 2). Видишь? Имя переменной одно, x, но привязаны к разным экземплярам, для каждого своя область в памяти. А вот переменная x = 1 живет только внутри функции инит, больше ниоткуда ее не увидишь. Если например в классе А еще есть функция def func(self): print 1, то вызов a.func() выглядет как вызов функции без аргументов, но, на самом деле, питон негласно сам подставляет туда первым аргументом ссылку на экземпляр. Новичков это зачастую сбивает с толку, когда они например читают лог ошибки, а там написано, что скажем передан один аргумент, а надо два, они не могут понять, какой они аргумент передали, ведь вообще без аргументов вызывали. Откуда он берется, у выше уже писАл.
-------------
добавлено в 13.05: забыл добавить. Функция __init__ (частенько еще ее называют конструктором, а иной раз это оспаривают) исполняется каждый раз, когда создается экземпляр данного класса.

JOIN_ME


репутация:
на сайте с 1970 года
сообщений:

#7572

Насчет кощунства добавлю. Класс по просту это некая структура, объединяющая в себе несколько функций и несколько переменных. Зачем использовать глобальную, если ее можно ассоциировать к этой группе?
-------------
добавлено в 14.29: А! Ну глобальным должна быть сама переменная, ссылающаяся на экземпляр класса. А уж сам экземпляр тебе выдаст переменную, относящуюся к нему.

nur87


репутация: 60
на сайте с 2006 года
сообщений: 559

Explay Golf

Казань

Возраст - 37

#7573

а если в классе требуется использовать переменную, которая была не объявлена в классе?
тогда как?

JOIN_ME


репутация:
на сайте с 1970 года
сообщений:

#7574

Объявить ее в классе. Или тогда вообще не писать на классах. (Куплю машину, чтоб пешком на работу ходить.)

redvel


репутация:
на сайте с 1970 года
сообщений:

#7575

Я видел, как в программах на питоне есть менюшки, использующие векторные иконки. Как такое сделать?
-------------
добавлено в 09.29: nur87,
Как выход, передавать нужную переменную класу. Так то нет тут ничего сложного

dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#7576

в листбоксе- документация
-------------
добавлено в 09.32: кроме листбокса нигде нативно, только свое рисовать.
-------------
добавлено в 15.54: nur87,
вот сам класс добавить метод например:

def func(instance, t): print t
class A: pass
A.func = func# теперь func- метод класса A.
a = A()
a.func("I'm function %s" % a.func.func_name)

redvel


репутация:
на сайте с 1970 года
сообщений:

#7577

dimy44,
Спасибо!
Что интересно, читал документацию на аппуифв2, но там написано, что клас Icon не потерпел изменений. Кстати в листбокс2 есть поддержка тача? Или у меня старая версия appuifw2
-------------
добавлено в 17.07: О класах я гдето читал в книжке такое простое пояснение
Преставь любой предмет. У каждого предмета есть свои характеристики, которые ему пренадлежат, там цвет, текстура и тд. Так вот надо представить класс таким же обьектом, у которого есть свои свойства и характеристики smile

dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#7578

appuifw2 нет на второй питон, а 1.4.х тач не поддерживает. Насчет аттрибутов. Можно и наоборот, защитить от некорректного присваивания, переопределив метод __setattr__. Например, я не хочу присваивать переменной x значение больше 10:

class A:
x = 0
def __setattr__(self, name, value):
if name == 'x':
if not isinstance(value, int) or value > 10:
print u'Пошел нафиг!'
return
self.__dict__[name] = value
a = A()

Virtuos86


репутация: 101
на сайте с 2008 года
сообщений: 802

где-то в России

#7579

Цитата: redvel
О класах я гдето читал в книжке такое простое пояснение
Преставь любой предмет. У каждого предмета есть свои характеристики, которые ему пренадлежат, там цвет, текстура и тд. Так вот надо представить класс таким же обьектом, у которого есть свои свойства и характеристики 


А теперь объясни как в твоей модели описать создание экземпляров класса? Хе-хе
-------------
добавлено в 21.19:
Цитата: dimy44
Насчет аттрибутов. Можно и наоборот, защитить от некорректного присваивания, переопределив метод __setattr__. Например, я не хочу присваивать переменной x значение больше 10:

class A:
    x = 0
    def __setattr__(self, name, value):
        if name == 'x':
            if not isinstance(value, int) or value > 10:
                print u'Пошел нафиг!'
                return
        self.__dict__[name] = value

a = A()


Неудачный пример.
Проверь:
a = A()
A.x = 11
print c.x
Да и чтобы поставить гард на один-два члена лучше использовать property. Хотя для начинающих это чересчур сильное колдунство winked.

dimy44


репутация: 537
на сайте с 2006 года
сообщений: 2540

HTC One S

Евпатория

Возраст - 53

#7580

smile) Так и знал, что на это укажут.


Яндекс.Метрика