Use descriptors.

This commit is contained in:
Guido van Rossum 2005-01-16 00:25:31 +00:00
parent fee7b93c60
commit 5a8a03784e
5 changed files with 9 additions and 11 deletions

View File

@ -446,9 +446,9 @@ class TestTimeDelta(HarmlessMixedComparison):
def test_subclass_timedelta(self): def test_subclass_timedelta(self):
class T(timedelta): class T(timedelta):
@staticmethod
def from_td(td): def from_td(td):
return T(td.days, td.seconds, td.microseconds) return T(td.days, td.seconds, td.microseconds)
from_td = staticmethod(from_td)
def as_hours(self): def as_hours(self):
sum = (self.days * 24 + sum = (self.days * 24 +

View File

@ -691,13 +691,13 @@ def metaclass():
class _instance(object): class _instance(object):
pass pass
class M2(object): class M2(object):
@staticmethod
def __new__(cls, name, bases, dict): def __new__(cls, name, bases, dict):
self = object.__new__(cls) self = object.__new__(cls)
self.name = name self.name = name
self.bases = bases self.bases = bases
self.dict = dict self.dict = dict
return self return self
__new__ = staticmethod(__new__)
def __call__(self): def __call__(self):
it = _instance() it = _instance()
# Early binding of methods # Early binding of methods
@ -2071,9 +2071,9 @@ def supers():
aProp = property(lambda self: "foo") aProp = property(lambda self: "foo")
class Sub(Base): class Sub(Base):
@classmethod
def test(klass): def test(klass):
return super(Sub,klass).aProp return super(Sub,klass).aProp
test = classmethod(test)
veris(Sub.test(), Base.aProp) veris(Sub.test(), Base.aProp)

View File

@ -246,9 +246,9 @@ static methods in C++ or Java. Here's an example:
>>> class C: >>> class C:
... ...
... @staticmethod
... def foo(x, y): ... def foo(x, y):
... print "staticmethod", x, y ... print "staticmethod", x, y
... foo = staticmethod(foo)
>>> C.foo(1, 2) >>> C.foo(1, 2)
staticmethod 1 2 staticmethod 1 2
@ -260,9 +260,9 @@ Class methods use a similar pattern to declare methods that receive an
implicit first argument that is the *class* for which they are invoked. implicit first argument that is the *class* for which they are invoked.
>>> class C: >>> class C:
... @classmethod
... def foo(cls, y): ... def foo(cls, y):
... print "classmethod", cls, y ... print "classmethod", cls, y
... foo = classmethod(foo)
>>> C.foo(1) >>> C.foo(1)
classmethod test.test_descrtut.C 1 classmethod test.test_descrtut.C 1
@ -286,10 +286,10 @@ call, not the class involved in the definition of foo().
But notice this: But notice this:
>>> class E(C): >>> class E(C):
... @classmethod
... def foo(cls, y): # override C.foo ... def foo(cls, y): # override C.foo
... print "E.foo() called" ... print "E.foo() called"
... C.foo(y) ... C.foo(y)
... foo = classmethod(foo)
>>> E.foo(1) >>> E.foo(1)
E.foo() called E.foo() called

View File

@ -80,6 +80,7 @@ class C(object):
-12 -12
""") """)
@staticmethod
def statm(): def statm():
""" """
A static method. A static method.
@ -91,8 +92,7 @@ class C(object):
""" """
return 666 return 666
statm = staticmethod(statm) @classmethod
def clsm(cls, val): def clsm(cls, val):
""" """
A class method. A class method.
@ -104,8 +104,6 @@ class C(object):
""" """
return val return val
clsm = classmethod(clsm)
def test_main(): def test_main():
from test import test_doctest2 from test import test_doctest2
EXPECTED = 19 EXPECTED = 19

View File

@ -191,12 +191,12 @@ class SeqDict(UserDict.DictMixin):
for key, value in self.iteritems(): for key, value in self.iteritems():
d[key] = value d[key] = value
return d return d
@classmethod
def fromkeys(cls, keys, value=None): def fromkeys(cls, keys, value=None):
d = cls() d = cls()
for key in keys: for key in keys:
d[key] = value d[key] = value
return d return d
fromkeys = classmethod(fromkeys)
class UserDictMixinTest(mapping_tests.TestMappingProtocol): class UserDictMixinTest(mapping_tests.TestMappingProtocol):
type2test = SeqDict type2test = SeqDict