469,361 Members | 2,336 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,361 developers. It's quick & easy.

CONSTRUCT - Adding Functionality to the Overall System

I understand that I can use __metaclass__ to create a class which
modifies the behaviour of another class.

How can I add this metaclass to *all* classes in the system?

(In ruby I would alter the "Class" class)

..

http://lazaridis.com

Sep 17 '06 #1
28 1628
On 17 Sep 2006 09:22:16 -0700, Ilias Lazaridis <il***@lazaridis.comwrote:
I understand that I can use __metaclass__ to create a class which
modifies the behaviour of another class.

How can I add this metaclass to *all* classes in the system?

(In ruby I would alter the "Class" class)
This is a terrible idea. When my, Joe Modulewriter, released my
library of AwesomeCoolClasses, i except my metaclass to be something
particular and if it starts getting wonky and I do anything hackery on
my end with the types, then the end-user's computer might 'splode!

What I am trying to say, is its a terrible idea to go changing other
peoples' classes at runtime without knowing the real affects of what
is going on. If you are just going to shoot yourself in the foot, why
should we even give you a gun?
Sep 17 '06 #2
Ilias Lazaridis wrote:
I understand that I can use __metaclass__ to create a class which
modifies the behaviour of another class.

How can I add this metaclass to *all* classes in the system?

(In ruby I would alter the "Class" class)
You'd have to set

__metaclass__ = whatever

at the top of each module whose classes are to get the new behavior.

You can't alter classes which you don't control or create in your code.

Georg
Sep 17 '06 #3
>I understand that I can use __metaclass__ to create a class which
modifies the behaviour of another class.

How can I add this metaclass to *all* classes in the system?

(In ruby I would alter the "Class" class)

You'd have to set

__metaclass__ = whatever

at the top of each module whose classes are to get the new behavior.
I think '__metaclass__ = whatever' affects only the creation of classes that
would otherwise be old-style classes?
You can't alter classes which you don't control or create in your code.
I remeber I've seen an implementation of import_with_metaclass somewhere on
IBM's developerworks. I didn't quite undersntad it though.

--
damjan
Sep 17 '06 #4
Damjan wrote:
I understand that I can use __metaclass__ to create a class which
modifies the behaviour of another class.

How can I add this metaclass to *all* classes in the system?

(In ruby I would alter the "Class" class)
You'd have to set

__metaclass__ = whatever

at the top of each module whose classes are to get the new behavior.

I think '__metaclass__ = whatever' affects only the creation of classes that
would otherwise be old-style classes?
It seems so:

http://mail.python.org/pipermail/pyt...ne/166572.html
You can't alter classes which you don't control or create in your code.

I remeber I've seen an implementation of import_with_metaclass somewhere on
IBM's developerworks. I didn't quite undersntad it though.
http://www-128.ibm.com/developerwork.../l-pymeta.html

I am not so much interested in old-style, as is start production with
python 2.4 (possibly even with python 2.5).

..

--
http://lazaridis.com

Sep 18 '06 #5
Ilias Lazaridis wrote:
Damjan wrote:
>>>>I understand that I can use __metaclass__ to create a class which
modifies the behaviour of another class.

How can I add this metaclass to *all* classes in the system?

(In ruby I would alter the "Class" class)

You'd have to set

__metaclass__ = whatever

at the top of each module whose classes are to get the new behavior.

I think '__metaclass__ = whatever' affects only the creation of classes that
would otherwise be old-style classes?


It seems so:

http://mail.python.org/pipermail/pyt...ne/166572.html

>>>You can't alter classes which you don't control or create in your code.

I remeber I've seen an implementation of import_with_metaclass somewhere on
IBM's developerworks. I didn't quite undersntad it though.


http://www-128.ibm.com/developerwork.../l-pymeta.html

I am not so much interested in old-style, as is start production with
python 2.4 (possibly even with python 2.5).
The fact remains that you won't be able to affect the built-in classes
such as int and str - they are hard-coded in C (for CPython, at least),
and so their metaclass is also implied and cannot be changed.

regards
Steve
--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://holdenweb.blogspot.com
Recent Ramblings http://del.icio.us/steve.holden

Sep 18 '06 #6
"Calvin Spealman" <ir********@gmail.comwrote in message
news:ma**************************************@pyth on.org...
On 17 Sep 2006 09:22:16 -0700, Ilias Lazaridis <il***@lazaridis.com>
wrote:
>I understand that I can use __metaclass__ to create a class which
modifies the behaviour of another class.

How can I add this metaclass to *all* classes in the system?

(In ruby I would alter the "Class" class)

This is a terrible idea. When my, Joe Modulewriter, released my
library of AwesomeCoolClasses, i except my metaclass to be something
particular and if it starts getting wonky and I do anything hackery on
my end with the types, then the end-user's computer might 'splode!

What I am trying to say, is its a terrible idea to go changing other
peoples' classes at runtime without knowing the real affects of what
is going on. If you are just going to shoot yourself in the foot, why
should we even give you a gun?
Reminds me of when I was learning Smalltalk, and modified printOn (ST's
equivalent of str()) of the root-of-all-classes object class. I don't
remember the exact error I made, but it was a mess undoing it!

-- Paul
Sep 18 '06 #7
Steve Holden wrote:
Ilias Lazaridis wrote:
....
http://www-128.ibm.com/developerwork.../l-pymeta.html

I am not so much interested in old-style, as is start production with
python 2.4 (possibly even with python 2.5).

The fact remains that you won't be able to affect the built-in classes
such as int and str - they are hard-coded in C (for CPython, at least),
and so their metaclass is also implied and cannot be changed.
....except in C.

I assume the "root class" should be available/changeable in "C", too.

Do I have to change the sources directly, or does python provide
"C-level-extension/modication" mechanisms, which can be applied to
core-level classes, too?

Is the Python Object Model documented anywhere in a diagram, something
similar to this?:

http://case.lazaridis.com/wiki/RubyObjectModel

..

Sep 19 '06 #8
On 18 Sep 2006 20:23:03 -0700, Ilias Lazaridis <il***@lazaridis.comwrote:
Steve Holden wrote:
Ilias Lazaridis wrote:
...
http://www-128.ibm.com/developerwork.../l-pymeta.html
>
I am not so much interested in old-style, as is start production with
python 2.4 (possibly even with python 2.5).
>
The fact remains that you won't be able to affect the built-in classes
such as int and str - they are hard-coded in C (for CPython, at least),
and so their metaclass is also implied and cannot be changed.

...except in C.

I assume the "root class" should be available/changeable in "C", too.

Do I have to change the sources directly, or does python provide
"C-level-extension/modication" mechanisms, which can be applied to
core-level classes, too?

Is the Python Object Model documented anywhere in a diagram, something
similar to this?:

http://case.lazaridis.com/wiki/RubyObjectModel
What could you possibly want to do this for so badly that you would
shun all alternatives and even resort to hacking up the runtime at the
C-level to redefine core types in non-standard and unpredictable
ways?! Seriously, please give a good reason for every doing this. I
can't imagine there is any way it would justify all this in the face
of just looking for an alternative. You aren't trying to use python,
at this point, you are trying to fork it.
Sep 19 '06 #9
Calvin Spealman wrote:
On 18 Sep 2006 20:23:03 -0700, Ilias Lazaridis <il***@lazaridis.comwrote:
Steve Holden wrote:
Ilias Lazaridis wrote:
...
http://www-128.ibm.com/developerwork.../l-pymeta.html

I am not so much interested in old-style, as is start production with
python 2.4 (possibly even with python 2.5).
>
The fact remains that you won't be able to affect the built-in classes
such as int and str - they are hard-coded in C (for CPython, at least),
and so their metaclass is also implied and cannot be changed.
...except in C.

I assume the "root class" should be available/changeable in "C", too.

Do I have to change the sources directly, or does python provide
"C-level-extension/modication" mechanisms, which can be applied to
core-level classes, too?

Is the Python Object Model documented anywhere in a diagram, something
similar to this?:

http://case.lazaridis.com/wiki/RubyObjectModel

What could you possibly want to do this for so badly that you would
shun all alternatives and even resort to hacking up the runtime at the
C-level to redefine core types in non-standard and unpredictable
ways?! Seriously, please give a good reason for every doing this. I
can't imagine there is any way it would justify all this in the face
of just looking for an alternative. You aren't trying to use python,
at this point, you are trying to fork it.
http://case.lazaridis.com/wiki/Please#OffTopicPosts

..

Sep 19 '06 #10
Damjan wrote:
>>I understand that I can use __metaclass__ to create a class which
modifies the behaviour of another class.

How can I add this metaclass to *all* classes in the system?

(In ruby I would alter the "Class" class)

You'd have to set

__metaclass__ = whatever

at the top of each module whose classes are to get the new behavior.

I think '__metaclass__ = whatever' affects only the creation of classes that
would otherwise be old-style classes?
Wrong.

If you set __metaclass__ = type, every class in that module will be new-style.

If you set __metaclass__ = MyClass, and MyClass inherits from <type>, every
class in that module will be new-style and have MyClass as a metaclass.

The usual way to create new-style classes, inheriting from object or another
new-style class, works because if no __metaclass__ is defined, the first
base class's class is taken as the metaclass.

Georg
Sep 19 '06 #11
>>
>I think '__metaclass__ = whatever' affects only the creation of
classes that
would otherwise be old-style classes?

Wrong.

If you set __metaclass__ = type, every class in that module will be
new-style.

If you set __metaclass__ = MyClass, and MyClass inherits from <type>, every
class in that module will be new-style and have MyClass as a metaclass.

The usual way to create new-style classes, inheriting from object or
another
new-style class, works because if no __metaclass__ is defined, the first
base class's class is taken as the metaclass.

I was under that impression, too. But this behaves different (py2.4):
---- test.py ----
class meta(type):
def __new__(*args):
print args
return type(*args[1:])

__metaclass__ = meta

class OldStyle:
pass

class NewStyle(object):
#__metaclass__ = meta

pass

---- test.py ----

deets$ python2.4 /tmp/test.py
(<class '__main__.meta'>, 'OldStyle', (), {'__module__': '__main__'})
deets$

I was astonished to see that. Any explanation?

Diez
Sep 19 '06 #12
>>__metaclass__ = whatever
>>>
at the top of each module whose classes are to get the new behavior.

I think '__metaclass__ = whatever' affects only the creation of classes
that would otherwise be old-style classes?

Wrong.

If you set __metaclass__ = type, every class in that module will be
new-style.
>>from UserDict import UserDict
type(UserDict)
<type 'classobj'>
>>class A(UserDict):
... pass
>>type(A)
<type 'classobj'>
>>__metaclass__ = type
class B(UserDict):
... pass
>>type(B)
<type 'classobj'>

It seems that NOT every class in my module will be a new style class,
especially those that inherit from other old-style classes in other
modules.

--
damjan
Sep 19 '06 #13
Diez B. Roggisch wrote:
>>>
I think '__metaclass__ = whatever' affects only the creation of
classes that
would otherwise be old-style classes?

Wrong.

If you set __metaclass__ = type, every class in that module will be
new-style.

If you set __metaclass__ = MyClass, and MyClass inherits from <type>, every
class in that module will be new-style and have MyClass as a metaclass.

The usual way to create new-style classes, inheriting from object or
another
new-style class, works because if no __metaclass__ is defined, the first
base class's class is taken as the metaclass.


I was under that impression, too. But this behaves different (py2.4):
[...]
deets$ python2.4 /tmp/test.py
(<class '__main__.meta'>, 'OldStyle', (), {'__module__': '__main__'})
deets$

I was astonished to see that. Any explanation?
Yes. I was wrong, the order of lookup is reversed. This first base class's
class is used before the global __metaclass__.

So what Damjan said is correct: global __metaclass__ is only usable for
classes that don't have bases.

Whether this is desirable is another question...

Georg
Sep 19 '06 #14
Ilias Lazaridis wrote:
I understand that I can use __metaclass__ to create a class which
modifies the behaviour of another class.

How can I add this metaclass to *all* classes in the system?

(In ruby I would alter the "Class" class)
I got confused from the discussion about __metaclass__.

possibly a little more practical.

I like to add a method "writeDebug(self, msg)" to all (or the most
possible) classes in the system.

How do I do this?

* with new style classes
* with old style classes
.

http://lazaridis.com
Sep 19 '06 #15
Ilias Lazaridis wrote:
Ilias Lazaridis wrote:
>I understand that I can use __metaclass__ to create a class which
modifies the behaviour of another class.

How can I add this metaclass to *all* classes in the system?

(In ruby I would alter the "Class" class)

I got confused from the discussion about __metaclass__.

possibly a little more practical.

I like to add a method "writeDebug(self, msg)" to all (or the most
possible) classes in the system.

How do I do this?

* with new style classes
* with old style classes
OMFG. For asking the question (paraphrased) "why do you want to do this",
Mr. Spealman received an

http://case.lazaridis.com/wiki/Please#OffTopicPosts

But now you do exactly that - give more details. Maybe this could teach you
the lesson that the variance of input you get here to your questions is
worth considering?

But I've got the wicked feeling that this won't happen...

Diez
Sep 19 '06 #16
Ilias Lazaridis wrote:
How do I do this?
It's easy:

def writeDebug(msg):
print "I do not debug things, I _evaluate_ with professionals on the
industries! See ticket 547!\n" \
"Oh yeah, and %s" % msg
....
class Foo:
writeDebug("how can I configure the interpreter for understand
Klingon participals and noun-phrases? Must I rectify the standard
dictionaries first?")

Regards,
Jordan

Sep 19 '06 #17
Diez B. Roggisch wrote:
Ilias Lazaridis wrote:
Ilias Lazaridis wrote:
I understand that I can use __metaclass__ to create a class which
modifies the behaviour of another class.

How can I add this metaclass to *all* classes in the system?

(In ruby I would alter the "Class" class)
I got confused from the discussion about __metaclass__.

possibly a little more practical.

I like to add a method "writeDebug(self, msg)" to all (or the most
possible) classes in the system.

How do I do this?

* with new style classes
* with old style classes

OMFG. For asking the question (paraphrased) "why do you want to do this",
Mr. Spealman received an

http://case.lazaridis.com/wiki/Please#OffTopicPosts

But now you do exactly that - give more details. Maybe this could teach you
the lesson that the variance of input you get here to your questions is
worth considering?

But I've got the wicked feeling that this won't happen...
I've not given more details, but less.

Just simplified my request.

..

Sep 19 '06 #18

MonkeeSage wrote:
Ilias Lazaridis wrote:
How do I do this?

It's easy:

def writeDebug(msg):
print "I do not debug things, I _evaluate_ with professionals on the
industries! See ticket 547!\n" \
"Oh yeah, and %s" % msg
where do I place this function...
...
class Foo:
writeDebug("how can I configure the interpreter for understand
Klingon participals and noun-phrases? Must I rectify the standard
dictionaries first?")
....thus it becomes available within class "Foo" and all other Classes?

Something like a central import?

..

Sep 19 '06 #19
Ilias Lazaridis wrote:
where do I place this function...
The place where you want it to be.
...thus it becomes available within class "Foo" and all other Classes?
Anything defined in the top-level (i.e., the sys.modules['__main__']
namespace) is accessible in every scope...but I assume you already know
that.

You could also use a super-duper super class from which to derive all
your other classes, and add/replace any methods you want there:

class lazaridis(object):
def evaluate(self, community):
if 1 is 1:
print "Evaluating %s... Result: failed!" % community

class Foo(lazaridis, str):
pass

f=Foo('This has been a test of the lazaridis evaluation system')
f.evaluate('Python')
f.evaluate('Ruby')
f.evaluate('Java')
print f
Something like a central import?
That would probably be the most logical thing to do.

But again, I assume you already know all this, so why are you asking?
Is this part of the evaluation process?

Regards,
Jordan

Sep 19 '06 #20
Ilias Lazaridis wrote:
MonkeeSage wrote:
>>Ilias Lazaridis wrote:
>>>How do I do this?

It's easy:

def writeDebug(msg):
print "I do not debug things, I _evaluate_ with professionals on the
industries! See ticket 547!\n" \
"Oh yeah, and %s" % msg


where do I place this function...

>>...
class Foo:
writeDebug("how can I configure the interpreter for understand
Klingon participals and noun-phrases? Must I rectify the standard
dictionaries first?")


....thus it becomes available within class "Foo" and all other Classes?

Something like a central import?

..
Good grief ...
--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://holdenweb.blogspot.com
Recent Ramblings http://del.icio.us/steve.holden

Sep 19 '06 #21
Ilias Lazaridis wrote:
I like to add a method "writeDebug(self, msg)" to all (or the most
possible) classes in the system.

How do I do this?

* with new style classes
* with old style classes
Short answer: you can't do it for builtin or extension types:
>>list.writeDebug = lambda msg: "You'd wish"
....
TypeError: can't set attributes of built-in/extension type 'list'

Longer asnwer: Make it a function instead of a method. This function
could try to call the respective method, and as a fallback it would
have hardcoded what to do for each supported class, something like:

def writeDebug(obj, msg):
try: return obj.writeDebug(msg)
except AttributeError:
if isinstance(obj,list):
# list msg
elif isinstance(obj,tuple):
# tuple msg
...
else:
# default object msg

If you insist though that you'd rather not use functions but only
methods, tough luck; you're better off with Ruby.

George

Sep 19 '06 #22
MonkeeSage wrote:
Ilias Lazaridis wrote:
where do I place this function...

The place where you want it to be.
...thus it becomes available within class "Foo" and all other Classes?

Anything defined in the top-level (i.e., the sys.modules['__main__']
namespace) is accessible in every scope...but I assume you already know
that.
no, I don't know it.

how do I define something into the top-level namespace? I assume I
could place it into the root-package of my project, into the __init__
function.

But how do I place it within my computers python installation (the big
init)?
You could also use a super-duper super class from which to derive all
your other classes, and add/replace any methods you want there:

class lazaridis(object):
....

I am aware of this technique.

But I want to modify existent classes, without touching their code.
Something like a central import?

That would probably be the most logical thing to do.

But again, I assume you already know all this, so why are you asking?
Is this part of the evaluation process?
I am not evaluating Python, I've started using it:

http://case.lazaridis.com/wiki/Lang
http://dev.lazaridis.com/base

-

I've noticed some interesting code on you website:

"
class file(file):
def reopen(self, name=None, mode='w', bufsize=None):
....

fh = file('test.txt', 'rb')
print fh # <open file 'test.txt', mode 'rb' at 0xb7c92814>
fh.reopen(mode='wb')
"
http://rightfootin.blogspot.com/2006...by-reopen.html

does this mean that I can add a method to a class in a similar way with
ruby? (by using class class-name(class-name): )

but the limitation is that I cannot do this with the python build-in
types?:

http://rightfootin.blogspot.com/2006...-reptiles.html

..

Sep 20 '06 #23
Ilias Lazaridis wrote:
no, I don't know it.
OK...so how do you evaluate a language when you don't know its basic
operations? Hmmm, sounds fishy.
how do I define something into the top-level namespace? I assume I
could place it into the root-package of my project, into the __init__
function.

But how do I place it within my computers python installation (the big
init)?
When you just say:

def blah(): pass

Now 'blah' function is in the top-level namespace, just like global
variables. Or if it's in a different file, you'd say 'from blah import
*'. You honestly don't know this?!??
I am aware of this technique.

But I want to modify existent classes, without touching their code.
The only way to do this is to explicitly subclass the existent classes
with your own class and modify what you want there in your subclass
(see below), or use multiple inheritence as I suggested previously.
I've noticed some interesting code on you website:

"
class file(file):
def reopen(self, name=None, mode='w', bufsize=None):
...

fh = file('test.txt', 'rb')
print fh # <open file 'test.txt', mode 'rb' at 0xb7c92814>
fh.reopen(mode='wb')
"
http://rightfootin.blogspot.com/2006...by-reopen.html

does this mean that I can add a method to a class in a similar way with
ruby? (by using class class-name(class-name): )
Basically, yes. In ruby you can reopen base classes; in python you can
get the same effect by subclassing the base classes with the same name
as the base class, then instantiating all your objects as that class.
This is the exact same idea as a "super-duper super class" as I
mentioned above.
but the limitation is that I cannot do this with the python build-in
types?:

http://rightfootin.blogspot.com/2006...-reptiles.html
You can subclass buit-in types using the same name as the parent class.
In fact here is what I use:

## my little library to make python more OO
## i.e., to get rid of the top-level junk...
## or at least to hide it behind some pretty
## object attributes :)
##
## YMMV - and don't complain if you don't
## like it; I wrote it for ME, not you
##
## Jordan Callicoat < Mo********@gmail.com >

## some global methods so we can use them
## to set up the class methods
def rpr(self):
return str(repr(self))
def stri(self):
return str(self)
def inte(self):
return int(self)
def leng(self):
return int(len(self))
def say(self):
print(self)
return self
def joi(self, sep=''):
return str(sep.join(self))
def ma(self, m):
return list(map(m, self))
def filt(self, m):
return list(filter(m, self))
def redu(self, m):
return list(reduce(m, self))
## now build all the subclasses
class int(int):
"""
Wrapper class for +int+
Provided methods:
str(), int(), repr(), say(),
len(), plus(), minus(),
times(), divided_by()
"""
def plus(self, i):
return int(self + i)
def minus(self, i):
return int(self - i)
def times(self, i):
return int(self * i)
def divided_by(self, i):
return int(self / i)

int.str = stri
int.repr = rpr
int.len = leng
int.int = inte
int.say = say

class str(str):
"""
Wrapper class for +str+
Provided methods:
str(), int(), repr(), say(),
len(), plus(), times()
"""
def plus(self, s):
return str(self + s)
def times(self, i):
return str(self * i)

str.str = stri
str.repr = rpr
str.len = leng
str.int = inte
str.say = say

class list(list):
"""
Wrapper class for +list+
Provided methods:
str(), int(), repr(), say(),
len(), plus(), times(), join()
"""
def plus(self, l):
return list(self + l)
def times(self, i):
return list(self * i)

list.str = stri
list.repr = rpr
list.len = leng
list.say = say
list.join = joi
list.map = ma
list.filter = filt
list.reduce = redu

class tuple(tuple):
"""
Wrapper class for +tuple+
Provided methods:
str(), int(), repr(), say(),
len(), plus(), times(), join()
"""
def plus(self, l):
return tuple(self + l)
def times(self, i):
return tuple(self * i)

tuple.str = stri
tuple.repr = rpr
tuple.len = leng
tuple.say = say
tuple.join = joi
tuple.map = ma
tuple.filter = filt
tuple.reduce = redu

class dict(dict):
"""
Wrapper class for +dict+
Provided methods:
str(), int(), repr(), say(),
len()
"""
pass

dict.str = stri
dict.repr = rpr
dict.len = leng
dict.say = say
dict.join = joi
## done with the global methods, remove them
del(rpr, stri, inte, say, joi, ma, filt, redu)
## show examples if called standalone
if (__name__ == '__main__'):
i = int(5)
n = i + 5
n.say()
i = i.times(5).divided_by(3).plus(2)
i.str().int().str().repr().say()

s = 'Tree'
i = str(s)
i = i.plus(' and dog\n').times(2)
i.repr().say()

def test(item):
return '%s!' % item
l = ['test', 'this', 'out', 'now']
i = list(l)
i = i.times(2)
i.join(' ').say()
i.map(test).say()

t = ('test', 'this', 'out', 'now')
i = tuple(t)
i = i.plus(('hi', 'there'))
i.join('+').repr().say()
i.map(test).say()

d = {'test': 'this', 'out': 'now'}
i = dict(d)
i.len().say()

It's not the most "pythojnic" way to do things, but it works for me.

Ps. I still have a hard time belieiving that after all the time you've
spent on comp.lang.lisp, comp.lang.ruby and comp.lang.python you still
don't understand these basic concepts...if that's really true, I would
never use your consulting service!

Regards,
Jorda

Sep 20 '06 #24
MonkeeSage wrote:
Ilias Lazaridis wrote:
>no, I don't know it.

OK...so how do you evaluate a language when you don't know its basic
operations? Hmmm, sounds fishy.
The learning-process is an important part of the evaluation.
>how do I define something into the top-level namespace? I assume I
could place it into the root-package of my project, into the __init__
function.

But how do I place it within my computers python installation (the big
init)?

When you just say:

def blah(): pass

Now 'blah' function is in the top-level namespace, just like global
variables. Or if it's in a different file, you'd say 'from blah import
*'. You honestly don't know this?!??
I know how to define it:

--- myBlahWithImport.py ---
from mylib import blah

if (__name__ == '__main__'):
blah()
--- end file ---

what I dont know is, how to negate the need of the import statement.

--- myBlah.py ---
if (__name__ == '__main__'):
blah()
--- end file ---
>I am aware of this technique.

But I want to modify existent classes, without touching their code.

The only way to do this is to explicitly subclass the existent classes
with your own class and modify what you want there in your subclass
(see below), or use multiple inheritence as I suggested previously.
>I've noticed some interesting code on you website:

"
class file(file):
def reopen(self, name=None, mode='w', bufsize=None):
...

fh = file('test.txt', 'rb')
print fh # <open file 'test.txt', mode 'rb' at 0xb7c92814>
fh.reopen(mode='wb')
"
http://rightfootin.blogspot.com/2006...by-reopen.html

does this mean that I can add a method to a class in a similar way with
ruby? (by using class class-name(class-name): )

Basically, yes. In ruby you can reopen base classes; in python you can
get the same effect by subclassing the base classes with the same name
as the base class, then instantiating all your objects as that class.
This is the exact same idea as a "super-duper super class" as I
mentioned above.
That's a part of the construct I was looking for.
>but the limitation is that I cannot do this with the python build-in
types?:

http://rightfootin.blogspot.com/2006...-reptiles.html

You can subclass buit-in types using the same name as the parent class.
So, that's a 2nd part of the constrcut I was looking for.

btw: from which class does "int" inherit?
In fact here is what I use:

## my little library to make python more OO
## i.e., to get rid of the top-level junk...
## or at least to hide it behind some pretty
## object attributes :)
##
## YMMV - and don't complain if you don't
## like it; I wrote it for ME, not you
##
## Jordan Callicoat < Mo********@gmail.com >

## some global methods so we can use them
## to set up the class methods
.... (many code I'll review at a later point)
It's not the most "pythojnic" way to do things, but it works for me.

Ps. I still have a hard time belieiving that after all the time you've
spent on comp.lang.lisp, comp.lang.ruby and comp.lang.python you still
don't understand these basic concepts...if that's really true, I would
never use your consulting service!

"CONSTRUCT - Adding Functionality to the Overall System"

This is not a basic concept.

Although in smaltalk and ruby is very simple.

But I've selected to use Python.

..

--
http://lazaridis.com
Sep 20 '06 #25
(I don't believe I am responding to a notorious troll ...)

One (bad) solution is to write in your sitecustomize.py the following:

$ echo /usr/lib/python/sitecustomize.py
import __builtin__

class Object(object):
def debug(self):
print 'some debug info'

__builtin__.object = Object

then you can do for instance
>>class C(object): pass
C().debug()
some debug info

All class inheriting from object will have the additional debug method.
However I DO NOT
RECOMMEND THIS SOLUTION FOR ANY SERIOUS WORK. For instance, it broke my
IPython installation and I am pretty sure it will broke other things
too.
But it may work for debugging purposes, if not for production use, so I
thought it was worth
posting.

Michee Simionato

Sep 20 '06 #26
Michele Simionato wrote:
(I don't believe I am responding to a notorious troll ...)
Believe it. You are. Ain't life a bitch? :-)
One (bad) solution is to write in your sitecustomize.py the following:

$ echo /usr/lib/python/sitecustomize.py
import __builtin__

class Object(object):
def debug(self):
print 'some debug info'

__builtin__.object = Object

then you can do for instance

>>>>class C(object): pass
C().debug()

some debug info

All class inheriting from object will have the additional debug method.
But sadly not the built-in types like int and str, which is what our
trollish friend wants to do (for some reason best known to himself).
However I DO NOT
RECOMMEND THIS SOLUTION FOR ANY SERIOUS WORK. For instance, it broke my
IPython installation and I am pretty sure it will broke other things
too.
But it may work for debugging purposes, if not for production use, so I
thought it was worth
posting.
regards
Steve
--
Steve Holden +44 150 684 7255 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://holdenweb.blogspot.com
Recent Ramblings http://del.icio.us/steve.holden

Sep 20 '06 #27
George Sakkis wrote:
Ilias Lazaridis wrote:
I like to add a method "writeDebug(self, msg)" to all (or the most
possible) classes in the system.

How do I do this?

* with new style classes
* with old style classes

Short answer: you can't do it for builtin or extension types:
>list.writeDebug = lambda msg: "You'd wish"
...
TypeError: can't set attributes of built-in/extension type 'list'

Longer asnwer: Make it a function instead of a method. This function
could try to call the respective method, and as a fallback it would
have hardcoded what to do for each supported class, something like:

def writeDebug(obj, msg):
try: return obj.writeDebug(msg)
except AttributeError:
if isinstance(obj,list):
# list msg
elif isinstance(obj,tuple):
# tuple msg
...
else:
# default object msg

If you insist though that you'd rather not use functions but only
methods, tough luck; you're better off with Ruby.
I insist on methods, and It seems that I stay with Python.

The effort for me to rework python to become more OO is much lesser,
than the effort I would have to rework Ruby to become more (this and
that).

http://case.lazaridis.com/wiki/Lang

And I've already started to like 2 things on python:

* the missing "end" statement and
* (I don't believe I write this) enforced indentation.

..

Sep 20 '06 #28
Steve Holden wrote:
Michele Simionato wrote:
(I don't believe I am responding to a notorious troll ...)
Believe it. You are. Ain't life a bitch? :-)
One (bad) solution is to write in your sitecustomize.py the following:

$ echo /usr/lib/python/sitecustomize.py
import __builtin__

class Object(object):
def debug(self):
print 'some debug info'

__builtin__.object = Object

then you can do for instance

>>>class C(object): pass
C().debug()
some debug info

All class inheriting from object will have the additional debug method.

But sadly not the built-in types like int and str, which is what our
trollish friend wants to do (for some reason best known to himself).
Followup thread:

[Watching this topic] CONSTRUCT - New/Old Style Classes,
build-in/extension types
http://groups.google.com/group/comp....3d71f3dd09939b

Sep 22 '06 #29

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

3 posts views Thread by Jim Heavey | last post: by
2 posts views Thread by Chris Wertman | last post: by
16 posts views Thread by Ilias Lazaridis | last post: by
12 posts views Thread by Ilias Lazaridis | last post: by
1 post views Thread by CARIGAR | last post: by
reply views Thread by zhoujie | last post: by
reply views Thread by suresh191 | last post: by
1 post views Thread by Marylou17 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.