Very good. I tried this with the following example and got the kind of behavior
I wanted. Thanks, everyone.
class A:
def __init__(self):
pass
def f(self):
print "A.f"
return
class B(A):
# no init method, inherit the A one
def f(self):
print "B.f"
return
class C(A):
def f(self):
print "C.f"
return
>>> from testClasses import *
>>> cc = C()
>>> cc.f()
C.f
>>> A.f(cc)
A.f
>>> B.f(cc)
Traceback (most recent call last):
File , line 0, in <stdin>##188
TypeError: unbound method f() must be called with B instance as first argument
(got C instance instead)
Carolyn Johnston (carolj)
Lead Researcher, MSN Applied Research Text group
Bldg 109/4053 | MIcrosoft Corporation
425-706-2153
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Michael Foord
Sent: Friday, March 27, 2009 11:29 AM
To: Discussion of IronPython
Subject: Re: [IronPython] .NET casts in IronPython
Carolyn Johnston (MSNAR) wrote:
> You are trying to apply C++ and C# thinking to Python. This is a
> fundamental philosophical difference between the languages. Python
> doesn't care what the object IS. Python only cares what it EXPOSES. If
> it has a GetName() method, you can call it, no matter what the object
> ancestry was. -- tim
>
> Well, C++ was my first language -- but I am a huge fan of Python and
> IronPython. Since I've dived into the deep end philosophically, I may as well
> push it a bit further.
>
> One of the most useful aspects of IronPython for me is the way that I can use
> IronPython as a loosely typed test environment for .NET classes that I've
> built in C#. Suppose I have a class B which is a subclass of A, which both
> define a function f(x). Suppose I have an object of class B on which (for
> some purely hypothetical reason) I want to run A.f(x) rather than B.f(x).
Actually the example pattern is pretty much how you do it.
Suppose you have an object 'a', which is an instance of a class that
inherits from (or implements) both A and B.
You can explicitly call the A version using:
A.f(a, x)
Or the B version:
B.f(a, x)
As you are calling the unbound method (on the class or interface), you
pass in the instance as the first argument.
Michael
> This is clearly at the interface of .NET design and Pythonian antiObjectian
> philosophy. Here's my question: is it doable within IronPython, or is it not?
> And if so, how?
>
>
> Thanks,
> :) Carolyn
>
> _______________________________________________
> Users mailing list
> [email protected]
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
> _______________________________________________
> Users mailing list
> [email protected]
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
--
http://www.ironpythoninaction.com/
_______________________________________________
Users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
_______________________________________________
Users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com