PyCharm 2024.1 Help

Pull members up, push members down

The Pull Members Up refactoring allows you to move class members to a superclass.

Pull Members Up refactoring can create abstract methods. If a project makes use of the interpreter Python 2.x, then only the instance methods can be abstracted. If a project uses Python 3.x, then any method can be abstracted.

Note that PyCharm automatically adds import statements, required for abstract methods.

The Push Members Down refactoring helps clean up the class hierarchy by moving class members to a subclass. The members are then relocated into the direct subclasses only.

Pull members up

  1. Select the class to be moved to a superclass.

  2. From the main or context menu, call Refactor | Pull Members Up. The Pull Members Up dialog appears.

  3. Select the destination object (superclass).

  4. In the Members section, select the members you want to move.

  5. To move a method as abstract, select the checkbox in the column Make abstract next to the method.

  6. Click Refactor to pull the selected members to their destination.

Before

After

class SuperClass: def super_method(self): pass class SubClassOne(SuperClass): def my_method(self): pass
class SuperClass: def super_method(self): pass def my_method(self): pass class SubClassOne(SuperClass): pass

Push members down

  1. In the editor, open the class whose members you need to push down.

  2. From the main or context menu, choose Refactor | Push Members Down. Push Members Down dialog displays the list of members to be pushed down.

  3. In the Members to be pushed down area, select the members you want to move. Note that the member at caret is already selected.

    If pushing a member might cause problems, you will be notified with red highlighting. It means that, if the situation is unattended, an error will emerge after refactoring. PyCharm prompts you with a Problems Detected dialog, where you can opt to ignore or fix the problem.

  4. Preview and apply changes.

Before

After

class SuperClass: def super_method(self): pass class SubClassOne(SuperClass): def my_method(self): pass class SubClassTwo(SuperClass): def my_method(self): pass
class SuperClass: pass class SubClassOne(SuperClass): def my_method(self): pass def super_method(self): pass class SubClassTwo(SuperClass): def my_method(self): pass def super_method(self): pass
Last modified: 26 May 2024