On 12/10/2018 01:19, Ryan Johnson wrote:
I am working on using mysql.connector in a class and have found an example of 
how to create a single connection that spans the lifetime of all instances of 
the class:

https://softwareengineering.stackexchange.com/a/358061/317228

however, I do not understand a few things about the class, including

1. Why it is subclassed as an object: `class Postgres(object):` ? I thought 
classes were necessarily objects.

This was sometimes necessary in Python 2.

2. Why is this portion of code directly addressing the class, instead of using 
the `cls` reference variable?
connection = Postgres._instance.connection = psycopg2.connect(**db_config)
cursor = Postgres._instance.cursor = connection.cursor()

In a subclass, the `cls' argument would refer to the subclass, while `Postgres' would still refer to the original class. I have no idea what this is trying to achieve, and I think it's probably a bug. Maybe someone else has an idea.

3. And is it me or does anyone else think {anydb}.connector’s usage is messy 
and inelegant? Ex:
print('connecting to PostgreSQL database...')
connection = Postgres._instance.connection = psycopg2.connect(**db_config)
cursor = Postgres._instance.cursor = connection.cursor()
cursor.execute('SELECT VERSION()')
db_version = cursor.fetchone()
        Why can’t we associate the focus of the connection with the connection 
itself, instead of creating a separate cursor object?

You can have multiple cursors on the same connection.


Also, within the code example, and in Python in general, why does there needs 
to be a __new__ constructor when there’s an __init__ constructor? I’ve read 
about the usage of singletons. It seems you could create singletons within  
__init__ or __new__ . Any enlightenment would be really helpful. I am very 
sleep-deprived, so I’m sorry if this seems like a dumb question.

I have read the official docs. Have also been reading “Python 3: Patterns, 
Recipes, and Idioms”. The first was mildly helpful but I still don’t see the 
benefit of a __new__ constructor.

You can't create a singleton with __init__: by the time __init__ is called, a new instance has already been created, and you can't switch the object for a different one. By using __new__, you can bypass the creation of a new instance.

If what you want is some shared state between all instances, a class variable or global will do just fine and there's no need for a singleton instance of anything.

Why is there dislike for Metaclasses?

They can be confusing.

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to