LINUX.ORG.RU

Global variables vs. class-based variables in python

 


0

1

Привет.

Возникла необходимость хранить список объектов к которым должен иметься доступ из различных модулей. Вот думаю как лучше сделать — глобальной переменной или классовой переменной. Поскольку имеется ряд функций для упрощения доступа к объектам в списке логичнее выглядит класс с классовой переменной содержащей объекты. Объекты само-собой могут добавляться и удаляться из списка, причем опять таки из различных модулей и эти изменения должны быть видны всем кто работает с данным списком.

Возможно существует еще какой-либо способ?

★★★★★

А под классовой переменной понимается статический член класса? Поскольку список изменяемый объект то пофигу, но со статическим членом меньше шансов поиметь конфликт имен.

AIv ★★★★★
()

Отдельный модуль, который парсит настройки/предоставляет доступ к настройкам и переменным?

pztrn ★★★★
()
Ответ на: комментарий от AIv

А под классовой переменной понимается статический член класса?

Ага.

class A(object):
    objlist = []
fat_angel ★★★★★
() автор топика

Flat is better than nested. Вобще не понимаю какой профит может быть с class-variable. Все предположения о логичней - не очевидны.

zz ★★★★
()

Возможно существует еще какой-либо способ?

О да.

class GlobalVars:
  def __init__(self):
  def do_something(self, ...):

g = GlobalVars()
do_something = lambda g = g: g.do_something(...)
del g
del GlobalVars

Теперь до твоих глобалов никто не доберется в обход do_something :)

tailgunner ★★★★★
()
Ответ на: комментарий от pztrn

Отдельный модуль, который парсит настройки/предоставляет доступ к настройкам и переменным?

В том числе и, но в данном случае список размерностей и единиц измерения в библиотеке для их (единиц) автоматического конвертирования.

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от zz

Акромя удобства работы с неизменяемыми объектами и исключения потенциальных конфликтов имен - никаких.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Про первое не понял, если второе про from foo import *, то ССЗБ. Как бы неймспейс модуля ничем от неймспейса класса не отличается, если не нужно порождать экземпляры класса.

zz ★★★★
()
Ответ на: комментарий от tailgunner

Если под инкапсуляцией понимается «закрыть от прямого доступа/разрешить доступ только через методы», то в питоне это в принципе не возможно;-)

AIv ★★★★★
()
Ответ на: комментарий от fat_angel

Это был мой вариант решения проблемы ;) Таким образом решаем, как минимум, возможные конфликты в global(), ибо они все принадлежат модулю.

pztrn ★★★★
()
Ответ на: комментарий от zz

Гы. Но тем не менее:

#var.py
a = [1,2,3]
...
#foo.py
from var import *
a[:] = [4,5,6]

Это питон... это ладно, со значениями аргументов по умолчанию, и с аргументами во вложенных ф-ях - вот где трэш, угар и содомия.

AIv ★★★★★
()
Ответ на: комментарий от tailgunner
>>> f = lambda s='qwerty' : 123
>>> f.func_defaults
('qwerty',)

Ваш К.О.;-)

AIv ★★★★★
()
Ответ на: комментарий от zz

Даже и не знаю что ответить... а какая связь между sys.exit() и обсуждаемой проблемой? ССЗБ не ответ.

Все сильно зависит от задачи, есть ситуации когда стат член класса (особенно если класс имеет какой-то функционал) удобней обычной глобальной переменной. И даже если не имеет - выделять отдельный модуль под 3 переменных это ИМНО перебор.

AIv ★★★★★
()
Ответ на: комментарий от AIv

Ну я не знаю, я вот просто не помню когда код с вайлдкард импортами видел в последний раз. Может года три назад. От конфликта имен для всех случаев класс все равно не спасет. Я бы выделил модуль, но, даже если его не выделять и ложить рядом с чем то еще, менее неймспейсом модуль сам по себе от этого не становится.

zz ★★★★
()
Ответ на: комментарий от zz

не помню когда код с вайлдкард импортами видел в последний раз.

Только вот не надо из питона делать вижуал бейсик, когда для доступа к переменной надо написать выражение на полстроки с пятью точками;-)

AIv ★★★★★
()
Ответ на: комментарий от zz

А чем это отличается от * (и __all__ в импортируемом модуле) с т.з. глобальных переменных? Ну кроме того что много букв писать приходиться?;-)

AIv ★★★★★
()
Ответ на: комментарий от AIv

Тем что мне в коде потом очевидно откуда этот символ? Ну и еще тем что после апдейта зависимости не вылазят ошибки с конфликтом имен.

zz ★★★★
()
Ответ на: комментарий от AIv

А чем это отличается от *

Конфликт имен очевиднее.

tailgunner ★★★★★
()
Ответ на: комментарий от zz

Ок, уговорили. Но я все равно для этого слишком ленив;-)

AIv ★★★★★
()

про singleton еще никто не вспоминал?

sp3
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.