Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Simple SOLID Java to Python example Error

I’m trying to convert a example code of an eCommerce Application from Java to Python to better understand this principle.

Here is the Java code that has this example:

public class ProductCatalog {
    public void listAllProducts() {
        ProductRepository productRepository = ProductFactory.create();
        
        List<String> allProductNames = productRepository.getAllProductNames();
        
        // Display product names
    }
}

public interface ProductRepository {
    public List<String> getAllProductNames();
}

public SQLProductRepository implements ProductRepository {
    public List<String> getAllPRoductNames() {
        return Arrays.asList("soap", "toothpaste");
    }
}

public class ProductFactory {
    public static ProductRepository create() {
        return new SQLProductRepository();
    }
}

My python code is:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

 import zope.interface

 class ProductRespository(zope.interface.Interface):
   def getAllProductNames(self) -> list:
     pass


 @zope.interface.implementer(ProductRespository)
 class SQLProductRepository:
   def getAllProductNames(self) -> list:
     return ["soap", "toothpaste"]


 class ProductFactory:
   def create(self) -> ProductRespository:
     return SQLProductRepository()


 class ProductCatalog:
   def listAllProducts(self) -> None:
      productRespository = ProductRespository()
      productRespository = ProductFactory.create()

      allProductNames = productRespository.getAllProductNames()
      print(allProductNames)


 myProductCatalog = ProductCatalog()
 myProductCatalog.listAllProducts()

The error is:

Traceback (most recent call last):
  File "/Users/me/udemy_courses/solid_principles/5_dependency_invertion.py", line 42, in <module>
    myProductCatalog.listAllProducts()
  File "/Users/me/udemy_courses/solid_principles/5_dependency_invertion.py", line 35, in listAllProducts
    productRespository = ProductFactory.create()
TypeError: ProductFactory.create() missing 1 required positional argument: 'self'

I guess that the problem could be in some creation of class from python or variable declaration, since this language don’t need to specify the type of variable.

>Solution :

You need to first call the class (object) and then run the function. OOP works a bit different in Python (I’m not familiar with Java but here’s how python gives it a go):

class Person:
    def name(self):
        print("John")

# Person.name() → Error
Person().name() # Works

Like the above example, simply replace productRespository = ProductFactory.create() to productRespository = ProductFactory().create() and it should work. Basically, you need to call the class as well to define self.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading