Advertisement
uzumaxy

Python Class Builder

Jan 24th, 2014
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.01 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2.  
  3. from copy import deepcopy
  4. from types import MethodType
  5.  
  6.  
  7. class ClassBuilder(object):
  8.  
  9.     def __init__(self, class_name, base_class_collection=(object,)):
  10.         self.class_name = class_name
  11.         self.base_class_collection = base_class_collection
  12.         self.class_attributes = dict()
  13.         self.class_functions = dict()
  14.         self.instance_attributes = dict()
  15.         self.instance_functions = dict()
  16.  
  17.     def __build_init_function(self):
  18.         def __init_function__(instance_self):
  19.             # Add attributes
  20.             for attr_name, attr_value in list(self.instance_attributes.items()):
  21.                 if isinstance(attr_name, str) and len(attr_name) > 0:
  22.                     setattr(instance_self, attr_name, deepcopy(attr_value))
  23.             # Add functions
  24.             for method_name, funct in list(self.instance_functions.items()):
  25.                 if isinstance(method_name, str) and len(method_name) > 0 and\
  26.                     hasattr(funct, '__call__'):
  27.                     method = MethodType(funct, instance_self)
  28.                     setattr(instance_self, method_name, method)
  29.         return __init_function__
  30.  
  31.     def build(self):
  32.         self.class_attributes['__init__'] = self.__build_init_function()
  33.         return type(self.class_name,
  34.             self.base_class_collection,
  35.             self.class_attributes)
  36.  
  37.  
  38. #DEBUG
  39. def say_hello(self):
  40.     print('Hello by ' + self.name)
  41. class_builder = ClassBuilder('Human')
  42. class_builder.instance_attributes['books'] = list()
  43. class_builder.instance_attributes['name'] = ''
  44. class_builder.instance_functions['say_hello'] = say_hello
  45. Human = class_builder.build()
  46. human1 = Human()
  47. human1.books.extend(['Human1 Book1', 'Human1 Book2'])
  48. human1.name = 'Maxim'
  49. human2 = Human()
  50. human2.books.append('Human2 Book1')
  51. human2.name = 'Andrey'
  52.  
  53. human1.say_hello()
  54. print('name = {0}; books = {1}'.format(human1.name, human1.books))
  55. human2.say_hello()
  56. print('name = {0}; books = {1}'.format(human2.name, human2.books))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement