A
Andrew Jaffe
Hi,
I have a class with various class-level variables which are used to
store global state information for all instances of a class. These are
set by a classmethod as in the following (in reality the setcvar method
is more complicated than this!):
class sup(object):
cvar1 = None
cvar2 = None
@classmethod
def setcvar1(cls, val):
cls.cvar1 = val
@classmethod
def setcvar2(cls, val):
cls.cvar2 = val
@classmethod
def printcvars(cls):
print cls.cvar1, cls.cvar2
I can then call setcvar on either instances of the class or the class
itself.
Now, the problem comes when I want to subclass this class. If I
override the setcvar1 method to do some new things special to this
class, and then call the sup.setcvar1() method, it all works fine:
class sub(sup):
cvar1a = None
@classmethod
def setcvar1(cls, val, vala):
cls.cvar1a = vala
sup.setcvar1(val)
@classmethod
def printcvars(cls):
print cls.cvar1a
sup.printcvars()
This works fine, and sets cvar and cvar2 for both classes.
However, if I *don't* override the setcvar2 method, but I call
sub.setcvar2(val) directly, then only sub.cvar2 gets set; it is no
longer identical to sup.cvar1!
In particular,
sub.setcvar1(1,10)
sub.setcvar2(2)
sub.printcvars()
prints
10
1 None
i.e. sub.cvar1, sub.cvar1a, sub.cvar2= 1 10 2
but sup.cvar1, cvar2= 1 None
since sup.cvar2 has never been set, and this is what sup.printcvars()
looks for.
This behavior is "expected", but is it desirable?
For my application, at least, I think the problem really comes in the
printcvars method: is there any way to call the overridden
sup.printcvars() but with, effectively, cls=sub?
Thanks for reading this far!
Andrew
Andrew
This seems like a bug
Is this expected behavior, or a bug (or both -- it is expected but
probably not what is wanted!)?
I have a class with various class-level variables which are used to
store global state information for all instances of a class. These are
set by a classmethod as in the following (in reality the setcvar method
is more complicated than this!):
class sup(object):
cvar1 = None
cvar2 = None
@classmethod
def setcvar1(cls, val):
cls.cvar1 = val
@classmethod
def setcvar2(cls, val):
cls.cvar2 = val
@classmethod
def printcvars(cls):
print cls.cvar1, cls.cvar2
I can then call setcvar on either instances of the class or the class
itself.
Now, the problem comes when I want to subclass this class. If I
override the setcvar1 method to do some new things special to this
class, and then call the sup.setcvar1() method, it all works fine:
class sub(sup):
cvar1a = None
@classmethod
def setcvar1(cls, val, vala):
cls.cvar1a = vala
sup.setcvar1(val)
@classmethod
def printcvars(cls):
print cls.cvar1a
sup.printcvars()
This works fine, and sets cvar and cvar2 for both classes.
However, if I *don't* override the setcvar2 method, but I call
sub.setcvar2(val) directly, then only sub.cvar2 gets set; it is no
longer identical to sup.cvar1!
In particular,
sub.setcvar1(1,10)
sub.setcvar2(2)
sub.printcvars()
prints
10
1 None
i.e. sub.cvar1, sub.cvar1a, sub.cvar2= 1 10 2
but sup.cvar1, cvar2= 1 None
since sup.cvar2 has never been set, and this is what sup.printcvars()
looks for.
This behavior is "expected", but is it desirable?
For my application, at least, I think the problem really comes in the
printcvars method: is there any way to call the overridden
sup.printcvars() but with, effectively, cls=sub?
Thanks for reading this far!
Andrew
Andrew
This seems like a bug
Is this expected behavior, or a bug (or both -- it is expected but
probably not what is wanted!)?