#!/usr/bin/env python3
 
from abc import ABCMeta, abstractmethod
import datetime
 
class DBint(metaclass=ABCMeta):
    @abstractmethod
    def getData(self):
        pass
 
class DB(DBint):
    def getData(self):
        return 'private data'
 
class Proxy(DBint):
    def __init__(self, db):
        self.db = db

    def getData(self):
        self.writeLog()
        return self.db.getData()

    def writeLog(self):
        print('request data in:', datetime.datetime.now())        
 
class User:
    def __init__(self, dataObj):
        self.dataObj = dataObj

    def requestData(self):
        return self.dataObj.getData()


db = DB()
user1 = User(db)
print(user1.requestData())

proxy = Proxy(db)
user2 = User(proxy)
print(user2.requestData())
