Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 30, 2008 11:16:49

demas
От:
Зарегистрирован: 2008-09-10
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

Значение переменной по ее имени

Добрый день,

У меня в классе есть вот такая конструкция:

class FilterCollection:
def __init__(self):
self.system = ''
self.customer = ''
self.status = ''

def get_by_name(self, name):
if (name == 'system'):
return self.system
elif(name == 'customer'):
return self.customer
elif(name == 'status'):
return self.status
Как можно переписать метод get_by_name(), чтобы он не увеличивался в размерах при увеличении количества переменных?



Офлайн

#2 Ноя. 30, 2008 11:51:27

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Значение переменной по ее имени

вот….

class a:
def __init__(self):
self.a=5
self.b='test'
def get(self,name):return self.__dict__[name]
b=a()
b.get('a')
хотя такая организация ни к чему хорошему не приведет… :)



Отредактировано (Ноя. 30, 2008 11:54:17)

Офлайн

#3 Ноя. 30, 2008 15:37:16

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

Значение переменной по ее имени

def get(self,name):return self.__dict__ != def get_by_name(self, name)



Офлайн

#4 Ноя. 30, 2008 15:40:11

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

Значение переменной по ее имени

class FilterCollection:
def __init__(self):
self.system = ''
self.customer = ''
self.status = ''

def get_by_name(self, name):
return getattr(self, name, None)



Офлайн

#5 Ноя. 30, 2008 15:44:32

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

Значение переменной по ее имени

а взагалі правильніше писати так:

[crchemist@test ~]$ cat ss.py
ATTR_NAME = 'status'

class FilterCollection(object):
def __init__(self):
self.system = ''
self.customer = ''
self.status = '200 OK'

fc = FilterCollection()
if hasattr(fc, ATTR_NAME):
print getattr(fc, ATTR_NAME)
else:
print 'No such attribute'
[crchemist@test ~]$ python ss.py
200 OK
[crchemist@test ~]$



Отредактировано (Ноя. 30, 2008 15:45:22)

Офлайн

#6 Ноя. 30, 2008 15:45:05

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Значение переменной по ее имени

А в чем разница?



Офлайн

#7 Ноя. 30, 2008 15:58:17

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

Значение переменной по ее имени

igor.kaist
А в чем разница?
в даному випадку нема: але є різниця для дескрипторів і атрибутів класу
[crchemist@test ~]$ cat ss.py
class A(object):
__slots__ = ('obj_attr_not_in_dict')

class_attr = 'i am class attr in class dict'
def __init__(self):
self.obj_attr_not_in_dict = 'i am object attr not in dict'

@property
def i_am_descriptor(self):
return 'i am not simple attr - i am descriptor'
[crchemist@test ~]$ python
Python 2.5.2 (r252:60911, Jul 5 2008, 03:54:54)
[GCC 4.3.0 20080428 (Red Hat 4.3.0-8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ss import A
>>> a = A()
>>> a.__dict__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute '__dict__'
>>> a.obj_attr_not_in_dict
'i am object attr not in dict'
>>> a.__class__.__dict__.items()
[('__module__', 'ss'), ('i_am_descriptor', <property object at 0x956bd24>), ('class_attr', 'i am class attr in class dict'), ('obj_attr_not_in_dict', <member 'obj_attr_not_in_dict' of 'A' objects>), ('__slots__', 'obj_attr_not_in_dict'), ('__doc__', None), ('__init__', <function __init__ at 0x9569304>)]
>>> a.__class__.__dict__.get('i_am_descriptor')
<property object at 0x956bd24>
>>>



Офлайн

#8 Ноя. 30, 2008 16:07:53

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

Значение переменной по ее имени

атрибути класу зберігаються не в звичайному словнику а в dictproxy тому

>>> a.__class__.__dict__.get('i_am_descriptor')
<property object at 0x956bd24>
>>> a.i_am_descriptor
'i am not simple attr - i am descriptor'
ну але це не стосується обєктів



Отредактировано (Ноя. 30, 2008 16:08:37)

Офлайн

#9 Ноя. 30, 2008 16:08:10

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Значение переменной по ее имени

Ну да, но для текущей задачи топикстартера хватит вполне… :)



Офлайн

#10 Ноя. 30, 2008 16:21:17

crchemist
От:
Зарегистрирован: 2008-07-09
Сообщения: 379
Репутация: +  0  -
Профиль   Отправить e-mail  

Значение переменной по ее имени

demas
Добрый день,

У меня в классе есть вот такая конструкция:

class FilterCollection:
def __init__(self):
self.system = ''
self.customer = ''
self.status = ''

def get_by_name(self, name):
if (name == 'system'):
return self.system
elif(name == 'customer'):
return self.customer
elif(name == 'status'):
return self.status
Как можно переписать метод get_by_name(), чтобы он не увеличивался в размерах при увеличении количества переменных?
Ще можна так:
class FilterCollection(object):
def __init__(self):
self.system = 'ss'
self.customer = ''
self.status = ''

get_by_name = object.__getattribute__



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version