Языки могут разрешить это, но ни одно сообщество не одобряет эту практику. Monkeypatching не оправдывается ни на одном языке, но вы слышите об этом чаще в Ruby, потому что форма открытого класса, которую он использует, делает очень и очень легким monkeypatch класс, и из-за этого более приемлемо в Ruby сообщества, но все еще осуждают . Monkeypatching просто не так распространен и не так прост в Python, поэтому вы не услышите те же аргументы против этого в этом сообществе. Python не делает ничего, что Ruby не делает для предотвращения практики.
Причина, по которой вы слышите / читаете об этом чаще всего в Ruby, заключается в том, что это в Ruby:
class MyClass
def foo
puts "foo"
end
end
class MyClass
def bar
puts "bar"
end
end
даст вам класс, который содержит два метода, foo
и bar
, тогда как в Python:
class MyClass:
def foo(self):
print "foo"
class MyClass:
def bar(self):
print "bar"
оставит вас с классом, который содержит только метод bar
, поскольку переопределение класса полностью перекрывает предыдущее определение. Чтобы сделать monkeypatch в Python, вы должны написать:
class MyClass:
def foo(self):
print "foo"
def bar(self):
print "bar"
MyClass.bar = bar
, который сложнее, чем версия Ruby. Уже одно это делает код Ruby намного проще для monkeypatch, чем код Python.