micropython/tests/basics/class_bind_self.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

62 lines
1.3 KiB
Python
Raw Normal View History

# test for correct binding of self when accessing attr of an instance
class A:
def __init__(self, arg):
self.val = arg
def __str__(self):
return 'A.__str__ ' + str(self.val)
def __call__(self, arg):
return 'A.__call__', arg
def foo(self, arg):
return 'A.foo', self.val, arg
def make_closure(x_in):
x = x_in
def closure(y):
return x, y is c
return closure
class C:
# these act like methods and bind self
def f1(self, arg):
return 'C.f1', self is c, arg
f2 = lambda self, arg: ('C.f2', self is c, arg)
f3 = make_closure('f3') # closure
def f4(self, arg): # generator
yield self is c, arg
# these act like simple variables and don't bind self
f5 = int # builtin type
f6 = abs # builtin function
f7 = A # user type
f8 = A(8) # user instance which is callable
f9 = A(9).foo # user bound method
c = C()
print(c.f1(1))
print(c.f2(2))
print(c.f3())
print(next(c.f4(4)))
print(c.f5(5))
print(c.f6(-6))
print(c.f7(7))
print(c.f8(8))
print(c.f9(9))
# test calling the functions accessed via the class itself
print(C.f5(10))
print(C.f6(-11))
print(C.f7(12))
print(C.f8(13))
print(C.f9(14))
# not working in uPy
#class C(list):
# # this acts like a method and binds self
# f1 = list.extend
#c = C()
#c.f1([3, 1, 2])
#print(c)