[Tutor] class/type methods/functions

bob gailer bgailer at gmail.com
Thu Oct 30 12:54:00 CET 2008


spir wrote:
> 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?

Take a look at the built-in functions classmethod and staticmethod
>
> 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
>
>
>
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>


-- 
Bob Gailer
Chapel Hill NC 
919-636-4239

When we take the time to be aware of our feelings and 
needs we have more satisfying interatctions with others.

Nonviolent Communication provides tools for this awareness.

As a coach and trainer I can assist you in learning this process.

What is YOUR biggest relationship challenge?



More information about the Tutor mailing list