Can I override a class function without creating a new class in Python?

前端 未结 3 1429
我寻月下人不归
我寻月下人不归 2021-02-08 13:10

I\'m making a game in pygame and I have made an \'abstract\' class that\'s sole job is to store the sprites for a given level (with the intent of having these level objects in a

3条回答
  •  孤独总比滥情好
    2021-02-08 13:47

    Yes, you can!

    class Foo:
        def do_other(self):
            print('other!')
        def do_foo(self):
            print('foo!')
    
    
    def do_baz():
        print('baz!')
    
    def do_bar(self):
        print('bar!')
    
    # Class-wide impact
    Foo.do_foo = do_bar
    f = Foo()
    g = Foo()
    # Instance-wide impact
    g.do_other = do_baz
    
    f.do_foo()  # prints "bar!"
    f.do_other()  # prints "other!"
    
    g.do_foo()  # prints "bar!"
    g.do_other()  # prints "baz!"
    

    So, before one of the more stanch developers goes on about how anti-python this might be

    Overwriting functions in this fashion (if you have a good reason to do so) seems reasonably pythonic to me. An example of one reason/way for which you might have to do this would be if you had a dynamic feature for which static inheritance didn't or couldn't apply.

    The case against might be found in the Zen of Python:

    • Beautiful is better than ugly.
    • Readability counts.
    • If the implementation is hard to explain, it's a bad idea.

提交回复
热议问题