Correct Way to Write in Python
Sagar Varule
punk.sagar at gmail.com
Sat Aug 3 11:59:02 EDT 2013
On Saturday, August 3, 2013 1:50:41 PM UTC+5:30, Steven D'Aprano wrote:
> On Fri, 02 Aug 2013 23:18:47 -0700, punk.sagar wrote:
>
>
>
> > Hi All,
>
> >
>
> > Im new to Python. Im coming from C# background and want to learn Python.
>
> > I was used to do following thing in C# in my previous experiences. I
>
> > want to know how do I implement below example in Python. How these
>
> > things are done in Python.
>
>
>
> I am not an expert on C#, but I'll try to translate the following code to
>
> Python.
>
>
>
>
>
> > [code]
>
> > public class Bank
>
> > {
>
> >
>
> > public List<Customer> lstCustomers = new List<Customer>();
>
> > private string micrcode;
>
> >
>
> > public void Bank()
>
> > {
>
> > customer
>
> > }
>
> >
>
> > }
>
> >
>
> > public class Customer
>
> > {
>
> > private srting customername;
>
> > public string CustomerName
>
>
>
> Do you mean "private string" rather than "private srting"?
>
>
>
>
>
> > {
>
> > get { return customername; }
>
> > set { customername = value; }
>
> > }
>
> > }
>
> >
>
> > main()
>
> > {
>
> > Customer objCustomer = new Customer;
>
> > objCustomer.CustomerName = "XYZ"
>
> >
>
> > Bank objBank = new Bank();
>
> > objBank.lstCustomer.Add(objCustomer);
>
> >
>
> > }
>
> > [/code]
>
>
>
>
>
> Here is a literally translation, as best as I can understand the C# code.
>
> (But note that this is not the best Python code.)
>
>
>
>
>
> class Bank:
>
> def __init__(self):
>
> self.lstCustomers = [] # Empty list of customers.
>
> self._micrcode = '' # Does this actually get used?
>
>
>
> class Customer:
>
> def __init__(self):
>
> self._customername = ''
>
>
>
> @property
>
> def CustomerName(self):
>
> return self._customername
>
>
>
> @CustomerName.setter
>
> def CustomerName(self, value):
>
> if not instance(value, str):
>
> raise TypeError('names must be strings')
>
> self._customername = value
>
>
>
>
>
> if __name__ == '__main__':
>
> # Running as a script, call the main function.
>
> objCustomer = Customer()
>
> objCustomer.CustomerName = "XYZ"
>
>
>
> objBank = Bank()
>
> objBank.lstCustomers.append(objCustomer)
>
>
>
>
>
>
>
> But this isn't how I would write it in Python. For starters, our naming
>
> conventions are different. Everything in Python is an object, even simple
>
> types like ints and strings, and even classes, so it isn't meaningful to
>
> prefix instances with "obj".
>
>
>
> We tend to avoid anything which even vaguely looks like Hungarian
>
> Notation, so "lstCustomer" is right out. Instead, we use plural for
>
> collections (lists, sets, dicts, whatever) of things, and singular for
>
> individual instances.
>
>
>
> Also, while we can use the "property" decorator to make computed
>
> attributes, we very rarely do just to enforce private/public variables.
>
> Our philosophy is, if you want to shoot yourself in the foot, we're not
>
> going to stop you. (People spend far too much time trying to work around
>
> private names in other languages for Python to spend too much effort in
>
> this area.) Instead, we have "private by convention": names starting with
>
> a single underscore are "private", so don't touch them, and if you do,
>
> you have nobody but yourself to blame when you shoot yourself in the foot.
>
>
>
> Similarly, the language doesn't spend much time enforcing type
>
> restrictions. Python is a dynamic language, and type restrictions go
>
> against that philosophy. If you have a good reason to put a non-string as
>
> the customer name, you can do so, but don't come crying to me if you
>
> break your code. So here is how I would write the above:
>
>
>
>
>
>
>
> class Bank:
>
> def __init__(self):
>
> self.customers = []
>
> self._micrcode = '' # Does this actually get used?
>
>
>
> class Customer:
>
> def __init__(self, name):
>
> # This type-check is optional.
>
> if not instance(name, str):
>
> raise TypeError('names must be strings')
>
> self.name = name
>
>
>
>
>
> if __name__ == '__main__':
>
> # Running as a script, call the main function.
>
> customer = Customer("XYX")
>
>
>
> bank = Bank()
>
> bank.customers.append(customer)
>
>
>
>
>
> The above is still not what I call professional quality -- no doc strings
>
> (documentation), and the bank doesn't actually do anything, but it's a
>
> start.
>
>
>
>
>
> --
>
> Steven
Thanks Steven for your Time and Effort. You have cleared many doubts and concepts for that I was struggling, since I started learning python. But I am falling in love for Python. Your explanation for private and public access modifier was awesome as I was having harding time finding why we dont have access modifier for python....Thanks a lot
More information about the Python-list
mailing list