[Tutor] how do you use __dict__ ? (Was: code dangerous?)

antonmuhin на rambler.ru antonmuhin на rambler.ru
Fri Jan 10 05:17:03 2003


Hello Alfred,

AM> ********************************************************

AM> class Person:
AM>      def __init__(self, name):
AM>          self.name = name

AM>      def speak(self):
AM>          __speak = self.__dict__.get('my_speak')
AM>          if __speak:
AM>              eval(__speak)
AM>          else:
AM>              print "%s says: my name is %s" % (self.name, self.name)

AM>      def crankyspeak(self):
AM>          print "%s says: I don't tell anyone my name" % (self.name)

AM> hobbit = Person('Bilbo Baggins')

AM> cranky = Person('someone else')
AM> cranky.__dict__['my_speak'] = 'self.crankyspeak()'

AM> hobbit.speak()
AM> cranky.speak()

AM> ********************************************************

I might be missing something, but why don't use simpler approach:

class Person:
      def __init__(self, name):
          self.name = name
          self.speakMethod = None

      def speak(self):
          if self.speakMethod:
              self.speakMethod(self)
          else:
              print "%s says: my name is %s" % (self.name, self.name)"

      def setSpeakMethod(self, speakMethod):
          self.speakMethod = speakMethod

def crankyspeak(person):
    print "%s says: I don't tell anyone my name" % (person.name)

hobbit = Person('Bilbo Baggins')
cranky = Person('someone else')

cranky.setSpeakMethod(crankyspeak)

hobbit.speak()
cranky.speak()

Best regards,
Anton.