I remember that there is some sort of syntax that will make a function of a class only callable by that class and not by any subclasses that inherit the functions of that class, but I can't recall exactly what it is and google has been of no help to me. Can anyone remind me how I would go about doing this?
Asked
Active
Viewed 196 times
2
-
That's not the done thing in python, so there's no simple way to do it. – sapi Dec 16 '13 at 01:13
-
Why would you want to do this? If you have a subclass of something, it should have all of the methods of that class. – Dec 16 '13 at 01:18
3 Answers
5
You can't enforce the privacy, but starting a method name with double underscores is the idiomatic Python way to indicate that the method should not be used by subclasses.

Community
- 1
- 1

Sam Mussmann
- 5,883
- 2
- 29
- 43
-
Thanks, that's exactly what I was thinking of. If I did ever need to strictly enforce the usage of the function to one class I would indeed just use Hyperboreus' answer, but the underscore syntax is the way I had in mind. – user3002473 Dec 16 '13 at 01:17
-
@user3002473 Glad to hear that, because my answer may be correct, but I wouldn't advise using it myself. – Hyperboreus Dec 16 '13 at 01:18
2
This works, but I think it is a bit of an anti-pattern:
class A:
def f(self):
if type(self) != A:
raise NotImplementedError('Thou shalt not invoke this here method.')
print('good')
class B(A): pass
A().f()
B().f()
But actually, please don't use it. Stick to the normal underscore and dunder notation with the implied name-wrangling. We are all adults around here. Especially as my approach can be easily broken from the outside:
type_ = type
type = lambda x: A
B().f()
type = type_

Hyperboreus
- 31,997
- 9
- 47
- 87
-
Just a quibble, but shouldn't you be raising `NotImplementedError()` rather than `NotImplementedError`? – sapi Dec 16 '13 at 01:13
-
2@SamMussmann Well any answer to a python question involving enforced privacy, will be unidiomatic I fear. – Hyperboreus Dec 16 '13 at 01:17
-
-
1@SamMussmann And you can also work around my approach quite easily. Snug in a `type = lambda x: A` before the calls, and all enforced privacy goes down the john. – Hyperboreus Dec 16 '13 at 01:21
0
I know, this is not an answer to your question, but you should really consider rethinking your object structure since you are violating the common principles of object oriented programming.

OBu
- 4,977
- 3
- 29
- 45
-
-
Inheritance is semantically a "is a"-relationship - and not a "is a except of"-relationship – OBu Dec 17 '13 at 12:51