Pythonのスーパー関数に問題があります。次の2つのクラスがあるとします。
class A(object):
x=5
def p(self):
print 'A'
def f(self):
self.p()
self.x+=1
class B(A):
def p(self):
print 'B'
def f(self):
super(B, self).f()
self.x*=2
b = B()
b.f()
その場合、bxは12に等しくなりますが、関数は「A」ではなく「B」を出力します。必要なのはBpの代わりにApを実行することですが、どうすればそれを達成できますか?
御時間ありがとうございます :)
編集:わかりました、私の悪い例のために、あなたは私の実際の状況についてのいくつかの詳細を見逃したと思います。実際のコードに取り掛かりましょう。私はこれらの2つのクラス(Djangoモデル)を持っています:
class Comment(Insert, models.Model):
content = models.TextField()
sender = models.ForeignKey('logic.User')
sent_on = models.DateTimeField(auto_now_add=True)
def __insert__(self):
self.__notify__()
def __notify__(self):
receivers = self.retrieve_users()
notif_type = self.__notificationtype__()
for user in receivers:
Notification.objects.create(
object_id=self.id,
receiver=user,
sender_id=self.sender_id,
type=notif_type
)
def __unicode__(self):
return self.content
class Meta:
abstract = True
class UserComment(Comment):
is_reply = models.BooleanField()
reply_to = models.ForeignKey('self', blank=True,
null=True, related_name='replies')
receiver = models.ForeignKey('User', related_name='comments')
def __insert__(self):
super(UserComment, self).__insert__()
self.__notify__()
def __notification__(self, notification):
if self.is_reply:
return '%s has replied your comment' % self.sender
return super(UserComment, self).__notification__(notification)
def __notify__(self):
# Notification objects "should" be created by Comment's __notify__
Update.objects.create(
object_id=self.id,
target=self.receiver,
type=self.__updatetype__(),
)
@classmethod
@cache(prop_name='_notificationtype')
def __notificationtype__(cls):
return NotificationType.objects.get(name='USER_COMMENT')
@classmethod
@cache(prop_name='_updatetype')
def __updatetype__(cls):
return UpdateType.objects.get(name='USER_COMMENT')
def retrieve_users(self):
return [self.receiver] # retrieve_users MUST return an iterable
問題は、両方のモデルのメソッドにあります__insert__
。は、オブジェクトがDBに最初に記録されたときに呼び出されるメソッドであり、主に通知目的で使用します。次に、これが私がやりたいことです:__notify__
__insert__
- UserCommentオブジェクトを作成し、保存します
- UserCommentインスタンスを呼び出す
__insert__
- コメントを呼び出す、コメント
__insert__
を呼び出す必要があります__notify__
__notify__
からUserCommentインスタンスを呼び出す__insert__
これは多かれ少なかれ簡単な方法で可能ですか、それともコードをリファクタリングする必要がありますか?
すべての回答に改めて感謝します。