Introduction to Python Programming - lms.sulb.uni-saarland.de
Transcript of Introduction to Python Programming - lms.sulb.uni-saarland.de
![Page 1: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/1.jpg)
Introduction to Python Programming
13 – Object Orientation II
Josef van Genabith (Stefan Thater)
Dept. of Language Science & Technology
Universität des Saarlandes
WS 2020/21
![Page 2: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/2.jpg)
Recap
2
class Account:
def __init__(self, number, holder):
self.number = number
self.holder = holder
self.balance = 0
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
self.balance -= amount
def print_info(self):
print('Balance:', self.balance)
![Page 3: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/3.jpg)
Recap
3
class Account:
def __init__(self, number, holder):
self.number = number
self.holder = holder
self.balance = 0
def set_deposit(self, amount):
self.balance += amount
def set_withdraw(self, amount):
self.balance -= amount
def get_print_info(self):
print('Balance:', self.balance)
![Page 4: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/4.jpg)
Recap
4
class Account:
def __init__(self, number, holder):
self.__number = number
self.__holder = holder
self.__balance = 0
def set_deposit(self, amount):
self.__balance += amount
def set_withdraw(self, amount):
self.__balance -= amount
def get_print_info(self):
print('Balance:', self.__balance)
![Page 5: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/5.jpg)
Recap
5
a1.Account(1, 'Stephan')
a2.Account(2, 'Josef')
…
a1.get_print_info()
a2.get_print_info()
…
a1.set_deposit(100)
a1.set_deposit(50)
…
a1.get_print_info()
a2.get_print_info()
…
![Page 6: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/6.jpg)
Objects and Classes
• Classes are objects, too.
• One (a single one) class object per class, created when Python
evaluates (reads) the class for the first time.
• Instances are created by “calling the class”
6
>>> class Account:
>>> def __init__(self, ...):
>>> ...
>>> ...
>>>
>>> Account
<class '__main__.Account'>
![Page 7: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/7.jpg)
Objects and Classes
• Instance variables (“self.xxx”) belong to an individual object;
the values can differ for different objects of the same class.
• Class variables belong to the class and are shared among all
instances of the class
7
class Account:
def __init__(self, number, holder):
self.number = number
self.holder = holder
self.balance = 0
...
Instance variables …
![Page 8: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/8.jpg)
Objects and Classes
• Instance variables (“self.xxx”) belong to an individual object; the
values can differ for different objects of the same class.
• Class variables belong to the class and are shared among all
instances of the class
8
class Account:
num_of_accounts = 0 # class attribute
def __init__(self, number, holder):
self.number = number
self.holder = holder
self.balance = 0
Account.num_of_accounts += 1
...
A class variable
![Page 9: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/9.jpg)
Objects and Classes
• Instance variables (“self.xxx”) belong to an individual object; the
values can differ for different objects of the same class.
• Class variables belong to the class and are shared among all
instances of the class
• Instance methods are also class variables
9
![Page 10: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/10.jpg)
Objects and Classes
>>> a.set_deposit(500)
‣ Python starts to search for the deposit method at the object
‣ The object contains only instance variables, no methods
‣ Continue search for method in class from which the object was created
10
a (account #1)
- number
- holder
- balance
Account
- __init__
- set_deposit
- set_withdraw
- set_print_info
is-a
![Page 11: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/11.jpg)
Objects and Classes
>>> a.set_deposit(500)
‣ Python starts to search for the deposit method at the object
‣ The object contains only instance variables, no methods
‣ Continue search for method in class from which the object was created
11
a (account #1)
- number
- holder
- balance
Account
- __init__
- set_deposit
- set_withdraw
- set_print_info
is-a
![Page 12: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/12.jpg)
Achtung: Shadowing …!
The code does not work: the instance variable balance overrides /
shadows the method balance(…)
12
class Account:
def __init__(self, ...):
self.balance = 0
...
def balance(self):
return self.balance
![Page 13: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/13.jpg)
Achtung: Shadowing …!
The code does not work: the instance variable balance overrides /
shadows the method balance(…)
13
class Account:
def __init__(self, ...):
self.balance = 0
...
def balance(self):
return self.balance
![Page 14: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/14.jpg)
Achtung: Shadowing …!
Convention: use “_” as the first character of the name of instance
variables to avoid name clashes.
14
class Account:
def __init__(self, ...):
self._balance = 0
...
def balance(self):
return self._balance
![Page 15: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/15.jpg)
Achtung: Shadowing …!
Convention: or use “__” as the first character of the name of
instance variables to avoid name clashes and for complete data
encapsulation (no access to data from outside except through
instance methods that come with the class).
15
class Account:
def __init__(self, ...):
self.__balance = 0
...
def balance(self):
return self.__balance
![Page 16: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/16.jpg)
Objects and Classes
• We can also assign attributes to a class object: class
attributes/variables
• Achtung: this is RARELY needed, but useful in example below:
16
class Account:
num_of_accounts = 0 # class attribute
def __init__(self, number, holder):
self.__number = number
self.__holder = holder
Account.num_of_accounts += 1
...
![Page 17: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/17.jpg)
Objects and Classes
• We can read class attributes via instance objects that were
created from this class
• Better: always access them via class name
17
>>> a1 = Account(1, "Timo")
>>> a2 = Account(2, "Stefan")
>>> a1.num_of_accounts
2
>>> Account.num_of_accounts
2
Better style!
![Page 18: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/18.jpg)
Objects and Classes
• We CAN NOT write class attributes via instance objects that
were created from this class.
• Line 3: we create an
instance variable that
locally overrides the class
variable!
18
>>> a1 = Account(1, "Timo")
>>> a2 = Account(2, "Stefan")
>>> a1.num_of_accounts += 1
>>> a1.num_of_accounts
3
>>> Account.num_of_accounts
2
![Page 19: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/19.jpg)
Objects and Classes
19
a1 (account #1)
- number
- holder
- num_of_accounts
a2 (account #2)
- number
- holder
>>> a1 = Account(1, "Timo")
>>> a2 = Account(2, "Stefan")
>>> a1.num_of_accounts += 1
>>> a1.num_of_accounts
3
>>> Account.num_of_accounts
2
Account
- __init__
- num_of_accounts
- set_withdraw
- set_deposit
is-a
is-a
![Page 20: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/20.jpg)
Coding Style
• Never give the same (“shadowing”) name to class attributes and
instance attributes.
• Always access class attributes via the class, never via instance
objects.
20
![Page 21: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/21.jpg)
Recap: Methods
• All methods we have seen so far are instance methods.
‣ the method itself “belongs” to the class, …, its actually a class
variable …
‣ but the method operates on the instance
• Designed to be called on an object of the class.
• The object on which it is called is automatically assigned to self
‣ All other parameters need to be given in method call.
21
![Page 22: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/22.jpg)
Static Methods
• Class objects can also have static methods.
‣ Designed to be called on the class object.
‣ Methods that do not involve a particular instance object, but that
somehow involve the class (e.g., class attributes)
‣ Methods creating objects of this class.
22
![Page 23: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/23.jpg)
Static Methods
23
class Account:
num_of_accounts = 0
def __init__(self, number, holder):
...
@staticmethod
def accounts_info():
print(Account.num_of_accounts,
"accounts have been created.")
if __name__ == "__main__":
a1 = Account(1, "John")
a2 = Account(2, "Jane")
Account.accounts_info()
no “self”!
preceeding line must be
@staticmethod
called a “decorator“
Works on class
variable
![Page 24: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/24.jpg)
Static Methods
• Python also provides an additional more powerful mechanism:
class methods.
• They are beyond the scope of our lecture for now.
24
![Page 25: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/25.jpg)
Types of Objects
• Values in Python have types:
‣ 1.5 has type float
‣ 'Stefan' has type str
‣ …
• The type of the stefansAcc instance object is the class from
which it was created
‣ stefansAcc = Account(1, "Stefan")
‣ type(stefansAcc) == Account ⇒ True
‣ isinstance(stefansAcc, Account) ⇒ True
25
![Page 26: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/26.jpg)
Modules
• For big programmes, Python code can get very long
• Modules are Python files that group related code
‣ Purpose: structure your code into modules to make it easier to
maintain.
• We can then import these modules in other modules.
‣ import my_module
‣ from my_module import my_function
‣ from my_module import *
• The module’s name is the name of the file name minus “.py”
26
![Page 27: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/27.jpg)
Modules
• When importing a module, the code in the module is evaluated
(Python executes the code in the file).
• Since modules are just Python files, we can execute them in the
usual way:
‣ F5 in IDLE
‣ python3 my_module.py (from the command line)
• Also: __name__ == "__main__"
‣ evaluates to True when the module is run, but False when it is
imported
‣ ⇒ We can use this in each module for automatic tests, but at
runtime, only the main module defines what happens!
27
![Page 28: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/28.jpg)
Modules
• Importable code should have no function calls outside of the “if
__name__ == '__main__'” block.
• What happens when we execute the main module?
28
# my_module.py
def f(x):
print(x)
f('Hello')
# main.py
import my_module
my_module.f('World')
![Page 29: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/29.jpg)
Compositionality
• The attributes of objects can be of any type
• They can be objects themselves
• This ability to create objects out of objects is called
compositionality.
‣ Access with dot notation: a1.holder.name
29
![Page 30: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/30.jpg)
Compositionality
30
class Person:
def __init__(self, name, surname):
self.name = name
self.surname = surname
class Account:
def __init__(self, number, person):
self.holder = person
self.number = number
self.balance = 0
def deposit(self, amount):
self.balance += amount
...
>>> p1 = Person("Jane", "Doe")
>>> a1 = Account(1, p1)
>>> a1.person.name
"Jane"
>>> a1.person.surname
"Doe"
>>>
![Page 31: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/31.jpg)
Shared References
• Need to be aware of where attributes point to
• In example below, modifying a1.holder also modifies
a2.holder
• Desired here, but may be a bug in another setting.
31
>>> p1 = Person("Jane", "Doe")
>>> a1 = Account(1, p1)
>>> a2 = Account(2, p1)
>>> a2.holder.surname
"Doe"
>>> a1.holder.surname = "Smith"
>>> a2.holder.surname
"Smith"
![Page 32: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/32.jpg)
Shared References
• Need to be aware of where attributes point to
• In example below, modifying a1.holder also modifies
a2.holder
• Desired here, but may be a bug in another setting.
32
>>> p1 = Person("Jane", "Doe")
>>> a1 = Account(1, p1)
>>> a2 = Account(2, p1)
>>> a2.holder.surname
"Doe"
>>> a1.holder.surname = "Smith"
>>> a2.holder.surname
"Smith"
Remember:
bad style!
![Page 33: Introduction to Python Programming - lms.sulb.uni-saarland.de](https://reader034.fdocuments.net/reader034/viewer/2022052301/62891cb174162629df6dc1a2/html5/thumbnails/33.jpg)
Composition vs Aggregation
• Composition = contained objects exist only within a complex
object
‣ Example: Object balance (of type int) does not exist without an
Account object. If the Account object is deleted, we don’t have any
reference to the balance any more.
• Aggregation = no implied ownership; contained objects can exist
independently; can also be used in more than one object.
‣ Example: Account object has a reference (attribute) to a
Customer/Person object. If Account object is deleted, the
Customer/Person object can still exist (e.g., customer has two
accounts).
33