File: class_bind_self.py

package info (click to toggle)
micropython 1.25.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 48,944 kB
  • sloc: ansic: 317,850; python: 59,539; xml: 4,241; makefile: 3,530; sh: 1,421; javascript: 744; asm: 681; cpp: 45; exp: 11; pascal: 6
file content (61 lines) | stat: -rw-r--r-- 1,356 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# 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)