CONSTRUCT - Adding Functionality to the Overall System

0 views
Skip to first unread message

Ilias Lazaridis

unread,
Sep 17, 2006, 12:22:16 PM9/17/06
to
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

Calvin Spealman

unread,
Sep 17, 2006, 2:41:34 PM9/17/06
to Ilias Lazaridis, pytho...@python.org

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?

Georg Brandl

unread,
Sep 17, 2006, 3:20:11 PM9/17/06
to

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

Damjan

unread,
Sep 17, 2006, 5:10:35 PM9/17/06
to

>> 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

Ilias Lazaridis

unread,
Sep 17, 2006, 11:44:30 PM9/17/06
to
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/python-list/2003-June/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/developerworks/linux/library/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

Steve Holden

unread,
Sep 18, 2006, 8:23:07 AM9/18/06
to pytho...@python.org
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

Paul McGuire

unread,
Sep 18, 2006, 8:57:30 AM9/18/06
to
"Calvin Spealman" <ironf...@gmail.com> wrote in message
news:mailman.210.11585184...@python.org...

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


Ilias Lazaridis

unread,
Sep 18, 2006, 11:23:03 PM9/18/06
to
Steve Holden wrote:
> Ilias Lazaridis wrote:
...

> > http://www-128.ibm.com/developerworks/linux/library/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

.

Calvin Spealman

unread,
Sep 19, 2006, 12:01:20 AM9/19/06
to Ilias Lazaridis, pytho...@python.org

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.

Ilias Lazaridis

unread,
Sep 19, 2006, 12:22:22 AM9/19/06
to

Georg Brandl

unread,
Sep 19, 2006, 2:22:41 AM9/19/06
to
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

Diez B. Roggisch

unread,
Sep 19, 2006, 4:16:36 AM9/19/06
to
>>
>> 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

Damjan

unread,
Sep 19, 2006, 4:19:52 AM9/19/06
to
>>> __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

Georg Brandl

unread,
Sep 19, 2006, 4:46:48 AM9/19/06
to
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

Ilias Lazaridis

unread,
Sep 19, 2006, 10:14:37 AM9/19/06
to

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

Diez B. Roggisch

unread,
Sep 19, 2006, 10:34:14 AM9/19/06
to
Ilias Lazaridis wrote:

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

MonkeeSage

unread,
Sep 19, 2006, 11:30:03 AM9/19/06
to
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

Ilias Lazaridis

unread,
Sep 19, 2006, 12:25:30 PM9/19/06
to

I've not given more details, but less.

Just simplified my request.

.

Ilias Lazaridis

unread,
Sep 19, 2006, 12:30:11 PM9/19/06
to

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?

.

MonkeeSage

unread,
Sep 19, 2006, 1:22:51 PM9/19/06
to
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

Steve Holden

unread,
Sep 19, 2006, 2:09:10 PM9/19/06
to pytho...@python.org
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 ...

George Sakkis

unread,
Sep 19, 2006, 3:21:43 PM9/19/06
to
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

Ilias Lazaridis

unread,
Sep 20, 2006, 7:54:18 AM9/20/06
to
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/09/ruby-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/08/of-rocks-and-reptiles.html

.

MonkeeSage

unread,
Sep 20, 2006, 8:39:05 AM9/20/06
to
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/09/ruby-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/08/of-rocks-and-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 < Monke...@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

Ilias Lazaridis

unread,
Sep 20, 2006, 11:06:45 AM9/20/06
to
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/09/ruby-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/08/of-rocks-and-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 < Monke...@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

Michele Simionato

unread,
Sep 20, 2006, 11:49:39 AM9/20/06
to
(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

Steve Holden

unread,
Sep 20, 2006, 12:15:42 PM9/20/06
to pytho...@python.org
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

Ilias Lazaridis

unread,
Sep 20, 2006, 1:48:07 PM9/20/06
to

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.

.

Ilias Lazaridis

unread,
Sep 22, 2006, 2:26:39 PM9/22/06
to
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.lang.python/browse_frm/thread/493d71f3dd09939b

Reply all
Reply to author
Forward
0 new messages