Re: class attrdict
On Mar 3, 4:25 am, [EMAIL PROTECTED] (Alex Martelli) wrote:
> Hallvard B Furuseth <[EMAIL PROTECTED]> wrote:
>
> > Does this class need anything more?
> > Is there any risk of a lookup loop?
> > Seems to work...
>
> > class attrdict(dict):
> > """Dict where d['foo'] also can be accessed as d.foo"""
> > def __init__(self, *args, **kwargs):
> > self.__dict__ = self
> > dict.__init__(self, *args, **kwargs)
> > def __repr__(self):
> > return dict.__repr__(self).join(("attrdict(", ")"))
>
> The problem is mostly that, given an instance a of attrdict, whether you
> can call (e.g.) a.update(foo) depends on whether you ever set
> a['update'], making the whole program extremely fragile -- a very high
> price to pay for some modest amount of syntax sugar.
>
> Alex
Then you will prefer something like this:
class Namespace(object):
def __init__(self, __ns={}, **kwargs):
if kwargs: __ns.update(kwargs)
self.__dict__ = __ns
--
http://mail.python.org/mailman/listinfo/python-list
Re: class attrdict
On Mar 4, 1:03 pm, "goodwolf" <[EMAIL PROTECTED]> wrote:
> On Mar 3, 4:25 am, [EMAIL PROTECTED] (Alex Martelli) wrote:
>
>
>
> > Hallvard B Furuseth <[EMAIL PROTECTED]> wrote:
>
> > > Does this class need anything more?
> > > Is there any risk of a lookup loop?
> > > Seems to work...
>
> > > class attrdict(dict):
> > > """Dict where d['foo'] also can be accessed as d.foo"""
> > > def __init__(self, *args, **kwargs):
> > > self.__dict__ = self
> > > dict.__init__(self, *args, **kwargs)
> > > def __repr__(self):
> > > return dict.__repr__(self).join(("attrdict(", ")"))
>
> > The problem is mostly that, given an instance a of attrdict, whether you
> > can call (e.g.) a.update(foo) depends on whether you ever set
> > a['update'], making the whole program extremely fragile -- a very high
> > price to pay for some modest amount of syntax sugar.
>
> > Alex
>
> Then you will prefer something like this:
>
> class Namespace(object):
> def __init__(self, __ns={}, **kwargs):
> if kwargs: __ns.update(kwargs)
> self.__dict__ = __ns
oops, there is an error (empty dict is created once).
Here corrected one:
class Namespace(object):
def __init__(self, __ns=None, **kwargs):
if __ns is None:
self.__dict__ = kwargs
else:
assert len(kwargs) == 0
self.__dict__ = __ns
If you are familiar with JS then you can simulate JS Object:
class JSLikeObject(object):
def __init__(self, __ns={}, **kwargs):
if kwargs: __ns.update(kwargs)
self.__dict__ = __ns
def __getitem__(self, name):
return getattr(self, name)
def __setitem__(self, name, value):
setattr(self, name, value)
def __delitem__(self, name):
delattr(self, name)
def __iter__(self):
return iter(self.__dict__)
def __contains__(self, name):
return hasattr(self, name)
but I don't sagest to use it in real life.
--
http://mail.python.org/mailman/listinfo/python-list
Re: class attrdict
class Namespace(object): def __init__(self, __ns=None, **kwargs): if __ns is None:#if no dictionary is given self.__dict__ = kwargs #then use kwargs without copying or creating new dict else: assert len(kwargs) == 0 self.__dict__ = __ns#else use dictionary without copyng #additional methods for JS like object (ONLY FOR DEMONSTRATION) def __getitem__(self, name): return getattr(self, name) def __setitem__(self, name, value): setattr(self, name, value) def __delitem__(self, name): delattr(self, name) def __iter__(self): return iter(self.__dict__) def __contains__(self, name): return hasattr(self, name) -- http://mail.python.org/mailman/listinfo/python-list
Re: Does python have the static function member like C++
On Apr 11, 5:19 am, "7stud" <[EMAIL PROTECTED]> wrote: > On Apr 10, 9:08 pm, "人言落日是天涯,望极天涯不见家" <[EMAIL PROTECTED]> wrote: > > > I define the class like this: > > class AAA: > > counter = 0 > > def __init__(self): > > pass > > def counter_increase(): > > AAA.counter += 1 > > print "couter now :", AAA.counter > > > But how could I call the function "counter_incrrease" ? > > > Thanks ! > > 1) > class AAA: > counter = 0 > def __init__(self): > pass > @staticmethod > def counter_increase(): > AAA.counter += 1 > print "couter now :", AAA.counter > > AAA.counter_increase() > > 2) > class AAA: > counter = 0 > def __init__(self): > pass > def counter_increase(): > AAA.counter += 1 > print "couter now :", AAA.counter > counter_increase = staticmethod(counter_increase) > > AAA.counter_increase() > > 3) > class AAA: > counter = 0 > def __init__(self): > pass > def counter_increase(self): > AAA.counter += 1 > print "couter now :", AAA.counter > aaa = AAA() > AAA.counter_increase(aaa) 1. In this case you will prefer a classmethod instead a staticmethod. 2. If counter is the number of instances of class AAA then you will incrase counter inside __init__ method. class AAA (object): counter = 0 def __init__(self): type(self).counter_increase() @classmethod def counter_increase(cls): cls.counter += 1 or class AAA (object): counter = 0 def __init__(self): type(self).counter += 1 -- http://mail.python.org/mailman/listinfo/python-list
Re: Does python have the static function member like C++
On Apr 11, 9:09 am, Bruno Desthuilliers wrote: > goodwolf a écrit : > (snip) > > > 1. In this case you will prefer a classmethod instead a staticmethod. > > 2. If counter is the number of instances of class AAA then you will > > incrase counter inside __init__ method. > > > class AAA (object): > > counter = 0 > > def __init__(self): > > type(self).counter_increase() > > You can call a class method on an instance: > self.counter_increase() > > And FWIW, this is probably something I'd put in the constructor (the > __new__ method), not in the initializer. > > > @classmethod > > def counter_increase(cls): > > cls.counter += 1 > > > or > > > class AAA (object): > > counter = 0 > > def __init__(self): > > type(self).counter += 1 > > Instances have a reference to their class, so you can also write this: >self.__class__.counter += 1 OK, you will use something like this: class AAA (object): counter = 0 def __new__(cls): cls.counter += 1 return super(cls, cls).__new__(cls) but I think that __new__ is more "low level" and not necessary here, so I will use: class AAA (object): counter = 0 def __init__(self): self.counter_increase() @classmethod def counter_increase(cls): cls.counter += 1 with yours correction invoking self.counter_increase() instead of more explicit type(self).counter_increase() -- http://mail.python.org/mailman/listinfo/python-list
Re: Does python have the static function member like C++
On Apr 11, 10:15 am, Bruno Desthuilliers wrote: > goodwolf a écrit : > > > > > On Apr 11, 9:09 am, Bruno Desthuilliers > [EMAIL PROTECTED]> wrote: > >> goodwolf a écrit : > >> (snip) > > >>> 1. In this case you will prefer a classmethod instead a staticmethod. > >>> 2. If counter is the number of instances of class AAA then you will > >>> incrase counter inside __init__ method. > >>> class AAA (object): > >>> counter = 0 > >>> def __init__(self): > >>> type(self).counter_increase() > >> You can call a class method on an instance: > >> self.counter_increase() > > >> And FWIW, this is probably something I'd put in the constructor (the > >> __new__ method), not in the initializer. > > >>> @classmethod > >>> def counter_increase(cls): > >>> cls.counter += 1 > >>> or > >>> class AAA (object): > >>> counter = 0 > >>> def __init__(self): > >>> type(self).counter += 1 > >> Instances have a reference to their class, so you can also write this: > >>self.__class__.counter += 1 > > > OK, you will use something like this: > > > class AAA (object): > > counter = 0 > > def __new__(cls): > > cls.counter += 1 > > return super(cls, cls).__new__(cls) > >return super(AAA, cls).__new__(cls) > > > but I think that __new__ is more "low level" and not necessary here, > > It's of course 'not necessary'. But (IMHO): > - increasing the class's instance counter is more a responsability of > the class than a responsability of the instance - and it has nothing to > do with initializing the instance's state > - if someone is to subclass AAA, there are fewer chances that he'll > override the constructer than the initializer, and if he does, there are > more chances that he won't forget to call on the parent's constructor. > > IOW, this is actually *because* it is 'lower level' that I think it's a > better place for such operations. > > But YMMV, of course !-) > > My 2 cents... OK, but then you will use an more flexible constructor: class AAA (object): counter = 0 def __new__(cls, *args, **kwargs): cls.counter += 1 return super(AAA, cls).__new__(cls, *args, **kwargs) then you see that you will pay lot resources for a "lower level" operation. However if your counter is to consider a low level think, than You are right, but it's more a personal consideration. -- http://mail.python.org/mailman/listinfo/python-list
Re: arguments of a function/metaclass
[EMAIL PROTECTED] je napisao/la:
> Hello,
>
>
> I have a member function with many (20) named arguments
>
> def __init__(self,a=1,b=2):
> self.a=a
> self.b=b
>
> I would like to get rid of the many redundant lines like self.a=a and
> set the members automatically.
> The list of default arguments could be given like
>
> def __init__(**kwargs):
> arglist={"a":1,"b":2]
>
> if this makes things easier
>
> Of course there has to be a check that raises an error in case of an
> unknown argument not mentioned in this list.
>
>
> I am sure there is an elegant way how to do this, could you give me any
> hints???
>
>
> Many thanks
>
>
>
> Daniel
A simply solution:
def __init__(self, a=1, b=2, c=3, ..):
for key, val in locals().items():
if key != 'self':
setattr(self.__class__, key, val)
in addition:
def set(self, **kwarg):
for key in kwargs:
if hasattr(self.__class__, key):
setattr(self.__class__, key, kwargs[key])
else:
raise
This solution is appropriate with use of proprieties.
For better proprety usage look at
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/442418
--
http://mail.python.org/mailman/listinfo/python-list
Re: arguments of a function/metaclass
Gabriel Genellina je napisao/la: > "goodwolf" <[EMAIL PROTECTED]> escribió en el mensaje > news:[EMAIL PROTECTED] > > A simply solution: > > > > def __init__(self, a=1, b=2, c=3, ..): > >for key, val in locals().items(): > >if key != 'self': > >setattr(self.__class__, key, val) > > > > in addition: > > > > def set(self, **kwarg): > >for key in kwargs: > >if hasattr(self.__class__, key): > >setattr(self.__class__, key, kwargs[key]) > >else: > >raise > > Why setattr(self.__class__,...) instead of setattr(self, ...)? You're > modifying the class attributes, and that's not usually intended. > > -- > Gabriel Genellina My error. Post was written directly. Sorry. -- http://mail.python.org/mailman/listinfo/python-list
Re: arguments of a function/metaclass
[EMAIL PROTECTED] je napisao/la:
> Hello,
>
>
> I have a member function with many (20) named arguments
>
> def __init__(self,a=1,b=2):
> self.a=a
> self.b=b
>
> I would like to get rid of the many redundant lines like self.a=a and
> set the members automatically.
> The list of default arguments could be given like
>
> def __init__(**kwargs):
> arglist={"a":1,"b":2]
>
> if this makes things easier
>
> Of course there has to be a check that raises an error in case of an
> unknown argument not mentioned in this list.
>
>
> I am sure there is an elegant way how to do this, could you give me any
> hints???
>
>
> Many thanks
>
>
>
> Daniel
def changeattrs(obj, __dict, **kwargs):
for name, value in __dict.iteritems():
if hasattr(obj, name):
setattr(obj, name, value)
else:
raise AttributeError
for name in kwargs:
if hasattr(obj, name):
setattr(obj, name, kwargs[name])
else:
raise AttributeError
def locals2self(depth=0):
import sys
ns = sys._getframe(depth+1).f_locals
obj = ns['self']
for name, value in ns.iteritems():
if name != 'self':
setattr(obj, name, value)
class C1(object):
def __init__(self, a=1, b=2, c=3, d=4):
locals2self()
class C2(object):
a = 1
b = 2
c = 3
d = 4
def __init__(self, **kwargs):
changeattrs(self, kwargs)
--
http://mail.python.org/mailman/listinfo/python-list
Re: output to console and to multiple files
like this?
class Writers (object):
def __init__(self, *writers):
self.writers = writers
def write(self, string):
for w in self.writers:
w.write(string)
def flush(self):
for w in self.writers:
w.flush():
import sys
logfile = open('log.txt', 'w')
sys.stdout = Writers(aya.stdout, file('log.out', 'w'), logfile)
sys.stderr = Writers(aya.stdout, file('log.err', 'w'), logfile)
--
http://mail.python.org/mailman/listinfo/python-list
Re: Help Required for Choosing Programming Language
In your situation consider C# too. If you like python then try IronPython for .NET. I think that C++ is not ideal for you. P.S.: VB6 is NOT a real OOP language. -- http://mail.python.org/mailman/listinfo/python-list
Re: Getting a class name
I suppose that you wont get class name into its code (or before definition end) but not into a method definition. import sys def getCodeName(deap=0): return sys._getframe(deap+1).f_code.co_name class MyClass (object): name = getCodeName() + '!' -- http://mail.python.org/mailman/listinfo/python-list
Re: Getting a class name
On Feb 18, 9:17 am, "Gabriel Genellina" <[EMAIL PROTECTED]> wrote: > En Sun, 18 Feb 2007 04:20:33 -0300, goodwolf <[EMAIL PROTECTED]> > escribió: > > > I suppose that you wont get class name into its code (or before > > definition end) but not into a method definition. > > > import sys > > > def getCodeName(deap=0): > > return sys._getframe(deap+1).f_code.co_name > > > class MyClass (object): > > name = getCodeName() + '!' > > What's the advantage over MyClass.__name__? > > -- > Gabriel Genellina >>> class C(object): ... name = C.__name__ ... Traceback (most recent call last): File "", line 1, in ? File "", line 2, in C NameError: name 'C' is not defined >>> -- http://mail.python.org/mailman/listinfo/python-list
Re: Question about idiomatic use of _ and private stuff.
On Feb 23, 5:12 pm, "Steven W. Orr" <[EMAIL PROTECTED]> wrote: > I understand that two leading underscores in a class attribute make the > attribute private. But I often see things that are coded up with one > underscore. Unless I'm missing something, there's a idiom going on here. > > Why do people sometimes use one leading underscore? > > TIA > > -- > Time flies like the wind. Fruit flies like a banana. Stranger things have .0. > happened but none stranger than this. Does your driver's license say Organ ..0 > Donor?Black holes are where God divided by zero. Listen to me! We are all- 000 > individuals! What if this weren't a hypothetical question? > steveo at syslang.net One underscore stay for 'protected'. Protected in OOP means that the attribute is hidden outside the class but visible for subclasses. In python one undersore is only a good convention for say that the attribute is protected. So users will ignore attributes with initial undersocre. Users who subclass must know of that attributes existence for prevent unwonted overriding. Sory for my english. -- http://mail.python.org/mailman/listinfo/python-list
Re: Solved: Question about idiomatic use of _ and private stuff.
> If you say > > from foo import _fooa, _foob, > > then the import will fail because the _ is used only by the import to > decide that you shouldn't see _fooa or _foob. ??? Read Python manuals, please. -- http://mail.python.org/mailman/listinfo/python-list
