Python is dynamic (duh)
Dynamic typing
You don’t need to specify the type of an object anywhere.
def PrintSomething(something):
print something
Everything is an object
Everything, yes, everything in Python is an object. Even an integer, a method, a class, etc.
Every object has got a type (__class__
), which actually can be changed at runtime, which usually results in conflicts about the allocated size for the PyObject
.
No typing needed
Python doesn’t know interfaces, for if a certain object wants to expose certain behaviour it just implements the required methods.
When you want a object to be comparible in python you don’t inherit something like IComparible
like in .Net, but you just create the __cmp__
method.
Fields and methods can be changed (and are the same)
A method and a field in python are 2 the same things. They both rely in the object’s dictionary (__dict__
) or of the object’s type’s dictionary (__class__.__dict__
).
This allows you to use an object which implements __call__
instead of a method.
For __dict__
is writeable you can change / create attributes (members) at runtime:
>>> sys.__dict__['foo'] = "bar"
>>> sys.foo
'bar'
A class member function is a normal method, wrapped
>>> class exampleclass:
value = ""
def examplefunction(self):
print self.value
>>> def examplereplacement(self):
print "replacement!"
print self.value
>>> instance = exampleclass()
>>> instance.examplefunction()
>>> instance.value = "foobar"
>>> instance.examplefunction()
foobar
>>> instance.examplefunction = examplereplacement
>>> instance.examplefunction()
Traceback (most recent call last):
File "<pyshell#15>", line 1, in -toplevel-
instance.examplefunction()
TypeError: examplereplacement() takes exactly 1 argument (0 given)
>>> instance.__class__.examplefunction = examplereplacement
>>> instance.examplefunction()
Traceback (most recent call last):
File "<pyshell#17>", line 1, in -toplevel-
instance.examplefunction()
TypeError: examplereplacement() takes exactly 1 argument (0 given)
>>> instance.__class__.__dict__['examplefunction'] = examplereplacement
>>> instance.examplefunction()
Traceback (most recent call last):
File "<pyshell#19>", line 1, in -toplevel-
instance.examplefunction()
TypeError: examplereplacement() takes exactly 1 argument (0 given)
>>> instance = exampleclass()
>>> instance.__class__.__dict__['examplefunction'] = examplereplacement
>>> instance.examplefunction()
replacement!
The bound methods seem to work a bit more tricky than they appear to work. Usually editing member functions via the __class__
‘s __dict__
will result in a proper replacement.
These were just a few examples of what Python has to offer. These features aren’t limited to Python. Iron Python, an implementation of Python in .Net is capable of letting usual .Net objects to be manipulated in similar ways with Python via Iron Python. Although this doesn’t actually change the .Net objects, changing the wrapper resulting in the required similar behaviour is good enough.
The author of Iron Python has been recruited by Microsoft and is now working on making the CLR more dynamic.
I’d love a static dynamic language.