# Dummy Example
# Python 3 Reflexive Metaprogramming
# H. Conrad Cunningham

# Developed for CSci 658, Software Language Engineering, Spring 2018

#234567890123456789012345678901234567890123456789012345678901234567890

# 2018-03-22: (V1)
# 2018-04-10: (V1a) Added type output statements

class Dummy:
    r = 1

    def __init__(self, s, t):
        self.s = s
        self.t = t

    def in_meth(self):
        print('In instance method in_meth')

    @classmethod
    def cl_meth(cls):
        print(f'In class method cl_meth for {cls.__name__}')

    @staticmethod
    def st_meth():
        print('In static method st_meth')

if __name__ == '__main__':
    print(f'Class variable Dummy.r = {Dummy.r}')
    print('d = Dummy(2,3)') 
    d = Dummy(2,3)
    print(f'Instance variable d.s = {d.s}')
    d.in_meth()
    print(f'Class variable accessed from instance d.r = {d.r}')
    Dummy.cl_meth()
    Dummy.st_meth()
    print(f'type(d.in_meth)     = {type(d.in_meth)}')
    print(f'type(Dummy.cl_meth) = {type(Dummy.cl_meth)}')
    print(f'type(Dummy.st_meth) = {type(Dummy.st_meth)}')
    din = d.in_meth
    print(f'din   = d.in_meth')
    print(f'din() = {din()}')
    print(f'type(din) = {type(din)}')
    print(f's.__dict__ = {d.__dict__}')
    print(f'Dummy.__dict__ = {Dummy.__dict__}')
    print(f'Dummy.__dict__["r"] = {Dummy.__dict__["r"]}')
    print(
        f'Dummy.__dict__["in_meth"] = {Dummy.__dict__["in_meth"]}')
    print(
        f'Dummy.__dict__["cl_meth"] = {Dummy.__dict__["cl_meth"]}')
    print(
        f'Dummy.__dict__["st_meth"] = {Dummy.__dict__["st_meth"]}')
    Dummy.in_meth() # TypeError
