Re: [Tutor] static methods and class methods
[static methods, class methods] > Both of these are rarely used; I don't think I have ever written a > class method in live code. I have used staticmethods as a convenient > way to put a function into a class namespace. this is someone out of the flow of the current thread now, but i forgot to mention in my previous post that, like kent, i too, have not used either of these much in practice on the past 11yrs of full-time Python development. class methods: the only time i've ever done a class method is when subclassing an immutable type, i.e., __new__() is a cls method, but that was for the book. i've never done one in practice. static methods: may have done 1 or 2 since they came out in 2.2, but in reality, if general code, they stay as global functions. if i really "want a function defined in a class definition, i may make one. but in practice, i often find that the functions that are most suitable as static methods end up being just *inner* functions defined inside a (regular) method. just my $0.02, -- wesley - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "Core Python Programming", Prentice Hall, (c)2007,2001 http://corepython.com wesley.j.chun :: wescpy-at-gmail.com python training and technical consulting cyberweb.consulting : silicon valley, ca http://cyberwebconsulting.com ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] static methods and class methods
"Kent Johnson" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] On Thu, Jun 12, 2008 at 7:48 PM, Alan Gauld <[EMAIL PROTECTED]> wrote: "Kent Johnson" <[EMAIL PROTECTED]> wrote> I am still unsure of the difference of static and class methods. No, that wasn't me, it was Christopher Spears. Sorry Kent, I got my header editing a bit mixed up. Python started off implementing "static methods" then later developed the sligtly more powerfull and flexible "class methods" and rather than lose backward compatibility called them classmethod. Are you sure? They were both introduced in Python 2.2 with new-style classes: http://www.python.org/doc/2.2.3/whatsnew/sect-rellinks.html Yes, but I'm fairkly sure I read an article by guido in a magazine or maybe the O'Reilly blogsite that they came up with the classmethod idea after they had already done the staticmethod stuff so they kept both. But I may be hallucinating again! :-) So in Python we have two ways of doing more or less the same (conceptual) thing. ?? But they are not the same thing. Conceptually they are both ways of defining a method that applies at the class level and could be used to implement class wide behavior. Thats what I mean. If you want to build a method to determine how many instances are active at any time then you could use either a staticmethod or a classmethod to do it. Most languages only give you one way. Python, despite its mantra, actually gives 2 ways to do it in this case. In contrast most of my major projects have used class methods I would be interested in an example if you care to share. I have used, or can imagine using, static methods that way but not class methods. Notice the space. I mean "class methods" in the OOP sense not specifically classmethods in the Python sense. I have never found anything in Python that I needed a classmethod rather than a staticmethod, although if I were writing dynamic AI type stuff I suspect I could find examples. But in almost any major project I will have a use for class based methods One specific example of how I've used classmethods in a networked client/server app was where we had a GUI client talking to a server. Both GUI and server used the same class interaces but the GUI implementation of the interface was just a pass through to the server. When the GUI messages reached the server a listener picked the message from a socket, decoded the target class and invoked a getInstance() class method. The class method extracted the instance ID from the message. If the object was in memory (an object pool) it called the requested method on the instance and returned the response to the GUI. If the instance was not in memory but an instanceID was provided it fetched the instance from the database and returned the called method response. If no ID was given it created a new instance, saved it to the database and then called the method on the new instance. If the message was a query then it was performed by another class method which just ran a SELECT on the underlying database tables. Its pretty obvious that the class methods here were non trivial. We also had garbage collection and pool management class methods too. We had about 100 data classes like this with the core functionality in a super DBClass' class methods which were in turn called by each subclass' class methods along with their individual attribute wrappers. To add to the interest the data was stored in multiple databases on different boxes around the globe, so the class methods also had to figure out which database instance to talk to when fetching or writing objects... Needless to say this was before the days or Object databases and ORMs! But the final system managed millions of objects with thousands of users in around a dozen countries, and did so for many years. (And all in C++ :-) Hope that makes sense! -- Alan Gauld Author of the Learn to Program web site http://www.freenetpages.co.uk/hp/alan.gauld ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] static methods and class methods
On Thu, Jun 12, 2008 at 7:48 PM, Alan Gauld <[EMAIL PROTECTED]> wrote: > "Kent Johnson" <[EMAIL PROTECTED]> wrote> > >> I am still unsure of the difference of static and class methods. No, that wasn't me, it was Christopher Spears. > > You are not alone, it is confusing! > >> A class method receives the class it was called on as the first >> argument. This can be useful with subclasses. A staticmethod doesn't >> get a a class or instance argument. It is just a way to put a plain >> function into the scope of a class. > > And that's the definition of the difference in Python. Yes, that is what I said :-) > Python started off implementing "static methods" then later > developed the sligtly more powerfull and flexible "class methods" and > rather than lose backward compatibility called them classmethod. Are you sure? They were both introduced in Python 2.2 with new-style classes: http://www.python.org/doc/2.2.3/whatsnew/sect-rellinks.html PEP 252 has an entire section on Static methods and class methods: http://www.python.org/dev/peps/pep-0252/ > So in Python we have two ways of doing more or less the same > (conceptual) thing. ?? But they are not the same thing. > In contrast most of my major projects have used class methods > in some way or other. Often in conjunction with factory classes or > as factory methods, but also as a persistence mechanism, a > streaming mechanism or as a database access technique. I would be interested in an example if you care to share. I have used, or can imagine using, static methods that way but not class methods. Kent ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] static methods and class methods
"Kent Johnson" <[EMAIL PROTECTED]> wrote> I am still unsure of the difference of static and class methods. You are not alone, it is confusing! A class method receives the class it was called on as the first argument. This can be useful with subclasses. A staticmethod doesn't get a a class or instance argument. It is just a way to put a plain function into the scope of a class. And that's the definition of the difference in Python. In the wider world of OOP they are two names for the same concept. Smalltalk and Lisp etc used the term "class method" to mean a method that applied to the class as a whole. C++ introduced the term "static method" to reflect the fact that it was loaded in the static area of memory(*) and thus could be called wiothout instantiating an object. This meant it could effectively be used as a class method. [(*) In C it is possible to prefix a normal function definition with the word static to get the compiler to load the fiunction into static memory - this often gives a performance improvement.] Python started off implementing "static methods" then later developed the sligtly more powerfull and flexible "class methods" and rather than lose backward compatibility called them classmethod. So in Python we have two ways of doing more or less the same (conceptual) thing. Both of these are rarely used; I don't think I have ever written a class method in live code. I have used staticmethods as a convenient way to put a function into a class namespace. In contrast most of my major projects have used class methods in some way or other. Often in conjunction with factory classes or as factory methods, but also as a persistence mechanism, a streaming mechanism or as a database access technique. (In Python there are so many good ORMs that the latter use is rarely necessary, but in other languages it can be an easy way of instantiating objects stored in a database.) They are also very powerful tools for writing OOP based MIS systems where you tend to be collecting information at the class level as well as the object level. But I think they are a bit like metaclasses, if you are not used to having them you tend to find other ways of doing the job. They are rarely essential, just sometimes a convenient shortcut. And class methods are often used in conjunction with meta-classes -- Alan Gauld Author of the Learn to Program web site http://www.freenetpages.co.uk/hp/alan.gauld ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] static methods and class methods
On Wed, Jun 11, 2008 at 12:17 AM, Christopher Spears <[EMAIL PROTECTED]> wrote: tcm.foo > > > > According to the author, the result for typing in 'tcm.foo' is > > calling class method foo() > foo() is part of class: TestClassMethod Try tcm.foo() tcm.foo without parentheses is the classmethod itself. You need parentheses to actually call it. > Did I do something wrong or is this an error on the book's part? > Intuitively, the answer I received makes more sense to me. I am still unsure > of the difference of static and class methods. Can someone enlighten me? A class method receives the class it was called on as the first argument. This can be useful with subclasses. A staticmethod doesn't get a a class or instance argument. It is just a way to put a plain function into the scope of a class. Both of these are rarely used; I don't think I have ever written a class method in live code. I have used staticmethods as a convenient way to put a function into a class namespace. Kent ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] static methods and class methods
tcm.foo > > > > Did I do something wrong or is this an error on the book's part? > Intuitively, the answer I received makes more sense to me. I am still unsure > of the difference of static and class methods. Can someone enlighten me? hi there, thanks for picking up the book. there are definitely some typos in the book, but this isn't one of them. marilyn is correct, instead of *calling* the method, you asked the interpreter to show you what object it represents [repr() for those if you who know]. tcm.foo <--- that is a function/method object that is callable tcm.foo() <-- actually call the function and return its output all you did wrong was to ask for the object instead of calling it. hope this helps! -- wesley ps. be sure to check out the Errata page at the book's website to get all the corrections... i'll be updating it within a few days with the latest changes. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "Core Python Programming", Prentice Hall, (c)2007,2001 http://corepython.com wesley.j.chun :: wescpy-at-gmail.com python training and technical consulting cyberweb.consulting : silicon valley, ca http://cyberwebconsulting.com ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] static methods and class methods
On Tue, June 10, 2008 9:17 pm, Christopher Spears wrote: > I am reading Wesley Chun's "Core Python Programming" (2nd Edition) and > have reached the part on static and class methods. I typed in the > following to demonstrate the difference between the two methods: > class TestClassMethod: > ... def foo(cls): > ... print 'calling class method foo()' > ... print 'foo() is part of class:',cls.__name__ > ... foo = classmethod(foo) > ... > > class TestStaticMethod: > ... def foo(): > ... print 'calling static method foo()' > ... foo = staticmethod(foo) > ... > tsm = TestStaticMethod() TestStaticMethod.foo() > calling static method foo() tcm = TestClassMethod() TestClassMethod.foo() > calling class method foo() foo() is part of class: TestClassMethod tcm.foo > 0xb7da0f2c>> > > > According to the author, the result for typing in 'tcm.foo' is You forgot to put () after the method name. Wesley has them. Class methods and static methods can be called, even when you don't have an instance of the class. I think that that's all there is to it. With the class method, the interpreter provides the class itself as the first argument. With the static, nothing comes in. What else? Marilyn Davis > > > calling class method foo() foo() is part of class: TestClassMethod > > Did I do something wrong or is this an error on the book's part? > Intuitively, the answer I received makes more sense to me. I am still > unsure of the difference of static and class methods. Can someone > enlighten me? > > Thanks! > > > > > ___ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] static methods and class methods
I am reading Wesley Chun's "Core Python Programming" (2nd Edition) and have reached the part on static and class methods. I typed in the following to demonstrate the difference between the two methods: >>> class TestClassMethod: ... def foo(cls): ... print 'calling class method foo()' ... print 'foo() is part of class:',cls.__name__ ... foo = classmethod(foo) ... >>> class TestStaticMethod: ... def foo(): ... print 'calling static method foo()' ... foo = staticmethod(foo) ... >>> tsm = TestStaticMethod() >>> TestStaticMethod.foo() calling static method foo() >>> tcm = TestClassMethod() >>> TestClassMethod.foo() calling class method foo() foo() is part of class: TestClassMethod >>> tcm.foo > >>> According to the author, the result for typing in 'tcm.foo' is calling class method foo() foo() is part of class: TestClassMethod Did I do something wrong or is this an error on the book's part? Intuitively, the answer I received makes more sense to me. I am still unsure of the difference of static and class methods. Can someone enlighten me? Thanks! ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor