Python is a very flexible language in this respect.
You can define your method outside of C and D classes scope, and bind it to them separately:
class A(object):
pass
class B(A):
pass
def method(self):
print '%s.method()' % type(self).__name__
class C(A):
method = method
class D(A):
method = method
c = C()
d = D()
c.method() # prints "C.method()"
d.method() # prints "D.method()"
print c.method # prints "<bound method C.method of <__main__.C object at 0x????????>>"
print d.method # prints "<bound method D.method of <__main__.D object at 0x????????>>"
You can introduce a new class that inherits from A, define your method in this class and inherit C and D from this new class. This is the 'classic' OOP approach.
You can implement your method in A and override it in B, telling it to raise some exception. Preferably something else than NotImplementedError as it's intended to be used in abstract classes - AttributeError seems like a better candidate. Note that if you're not going to instantiate A class in your code, it will make sense for A.method to raise NotImplementedError, effectively converting A into an abstract class.
You can resort to duck-typing and simply implement two identical methods in C and D. Python is big on duck-typing, but not big on duplicating code, so this might not be the best solution in this situation.