[Tutor] class/type methods/functions

spir denis.spir at free.fr
Thu Oct 30 12:27:57 CET 2008


Hello,

New to the list. I'm a self-taught, amateur programmer. Also, non-native 
english speaker -- so, don't be surprised with weird expression.

Q: Is there a way to write /type/ (class) functions, meaning methods not 
bound to an instance, in python?

Context: I'm developping an application that should be able to 
read/write wiki source text and matching xhtml docs (and more...). 
Actually, a first version worked, but I'm refactoring it for several 
reasons. To do that, I use a core set of 'symbol' types:
wiki lang1
wiki lang2 ==> config ==> symbol types <== xhtml subset
wiki lang3
Each type holds relevant config data and is defines methods used to cope 
with r/w processes. Each symbol holds relevant data, read from 
(whichever) source text, and is able to write itself into (any) target 
language. A sequence of symbols thus builds a kind of abstract 
representation of a source text:
wiki text  <==>  symbol sequence  <==>  xhtml doc
[I'm aware that there are more efficient and professional methods -- 
it's not the point here. And I like this model ;-).]
Example of a symbol type:
class Format(Symbol):
    ''' block format symbol '''
    # import relevant config data
    from_codes = config.formats.from_codes
    to_codes = config.formats.to_codes
    names = config.formats.names
    [...methods...]
Now, I want to let the user change the wiki config at runtime in order 
to 'transcode' a wiki text into another wiki language.
To achieve that, I intended to put config import instructions in a 
/type/ method, thus callable at runtime ():
class Format(Symbol):
    ''' block format symbol '''
    # import relevant config data
    def config():
        Format.from_codes = config.formats.from_codes
        Format.to_codes = config.formats.to_codes
        Format.names = config.formats.names
    [...methods...]
[...more classes...]
def config()
    config.build_config(config_file_name)
    for symbol_type in Symbol.types:
       symbol_type.config()

Problem:
I can't find any way to write a non_bound_to_an_instance method, a type 
specific method. I get of course the following:
"TypeError: unbound method config() must be called with Format instance 
as first argument (got nothing instead)"
While the Format's config() function is not intended to be a instance 
method at all. It is a type specific attribute.

Exploration:
As types (classes) are supposed to be objects, they should have their 
own attributes like any instance. Both functional (callable, methods) 
and non_functional (data, properties). Data attributes work well for a 
type, e.g.
MyType.attr = x
print MyType.attr
But strangely I can't find the way to do that for callable things:
MyType.f() launches the previous error message.
Actually, does python syntax give a way to distinguish type attributes 
from instance attributes, in the case of methods? I don't know. One can 
write:
attr            --> type property r/w (1)
MyType.attr     --> type property r/w (1)
self.attr       --> instance property r/w
???             --> type method def/call
f(self,args)    --> instance method definition
self.f(args)    --> instance method call
(1) Inside the type's definition, at upper level, the owner of the 
attribute needs not beeing specified: it is the type. Elsewhere, the 
attribute must be prefixed.
The problem may reside in the difference of syntax between properties 
and methods. To identify instance attributes, self.x is used for 
properties in both definition (write) and use (read) cases, while for 
methods the definition has to be written f(self,args) instead of 
self.f(args). Imagine that the syntax would be consistent. One could 
then write:
class T(instance):
    ''' type with type method '''
    a = 1
    def f():
        print "I'm a type method. 'a' is:", T.a
    def self.g():
       print "I'm an instance method. 'b' is:", self.b
    def self.__init__(b):
       self.b = b
T.f()
z = T(2)
z.g()
Note that this or that syntax is just a convention. And that "def 
self.g()" does not seem to conflict with present syntax rules. In fact, 
it more consistent with the rules for non-callable attributes, and 
reflects the method call syntax. At least, that's what I currently think.
Actually no syntax reflect the 'real' background process of instance 
method call, which in that case would be (note that both type and 
instance are passed as arguments):
T.__dict__['g'].__get__(z, T)
see 
[http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html]:

Workaround:
I presently plan to 'externalise' type config functions at module level.
def format_config():
    Format.from_codes = config.formats.from_codes
    Format.to_codes = config.formats.to_codes
    Format.names = config.formats.names
[...more pseudo type-specific config functions...]
def config()
    config.build_config(config_file_name)
    format_config()
    [...more calls to type config functions...]
But I'm not happy with that at all... Type specific features should 
definitely lie inside the type's definition!

What do you think of that? Maybe an obvious python feature hasn't 
reached my mind yet...
Denis





More information about the Tutor mailing list