From c1e34e4375921f61e140eabe94c157d8e6b202a2 Mon Sep 17 00:00:00 2001 From: Aida Eslami Date: Sat, 6 Dec 2025 14:08:21 +0000 Subject: [PATCH 1/8] class and Objs --- .DS_Store | Bin 0 -> 6148 bytes type/person.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 .DS_Store create mode 100644 type/person.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7b3ce1fb87d4dc9ca9a9ba7811d2dd68d5812f70 GIT binary patch literal 6148 zcmeHKK~CH-6n%zSOj~J&O;I)Ui*#eX2lICp5)pUqP zeUuoYhZ&~CU_pVPz-w1PzTGbR$T8+uTmOE?IKnzcNWW!yznA4bwv=UJn`!+c$1L8patf|MJnBWlS9{B)TcJgw5x7%B5Jrj+Z@ zq4J;O>zC(i2`4!9`n&epbQteBez32Skxr>W$#I@=+ bool: + return person.age >= 18 + +# def get_phone(person: Person) -> str: +# return person.phone_number + +imran = Person("Imran", 22,"Shiraz", "Ubuntu") +print(imran.name) +print(imran.address) + +aida = Person("Aida", 34, "Tehran", "Arch Linux") +print(aida.name) +print(aida.address) +print(is_adult(imran)) + + + + +# def get_phone(person: Person) -> str: +# return person.phone_number +# +# print(get_phone(aida)) +# Person.py:12: error: "Person" has no attribute "phone_number" [attr-defined] +# Found 1 error in 1 file (checked 1 source file) \ No newline at end of file From 0d47463122d4c2e04cb78f485491b39e8477856f Mon Sep 17 00:00:00 2001 From: Aida Eslami Date: Sat, 6 Dec 2025 14:30:17 +0000 Subject: [PATCH 2/8] method --- type/method.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 type/method.py diff --git a/type/method.py b/type/method.py new file mode 100644 index 00000000..d72c8c84 --- /dev/null +++ b/type/method.py @@ -0,0 +1,15 @@ +from datetime import date +thisYear = date.today().year + + +class Person: + def __init__(self, name: str, age: int, preferred_operating_system: str): + self.name = name + self.age = thisYear - age + self.preferred_operating_system = preferred_operating_system + + def is_adult(self): + return self.age <= thisYear - 18 + +imran = Person("Imran", 4, "Ubuntu") +print(imran.is_adult()) From 1f1dd9dd8cecb5790bdab2ac4b6f5170e5ab3394 Mon Sep 17 00:00:00 2001 From: Aida Eslami Date: Sat, 6 Dec 2025 15:29:34 +0000 Subject: [PATCH 3/8] DataClasses --- type/__pycache__/dataclasses.cpython-313.pyc | Bin 0 -> 722 bytes type/myDataclasses.py | 28 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 type/__pycache__/dataclasses.cpython-313.pyc create mode 100644 type/myDataclasses.py diff --git a/type/__pycache__/dataclasses.cpython-313.pyc b/type/__pycache__/dataclasses.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34e091e701ff3a776feb6d1b6e0851cbe3944506 GIT binary patch literal 722 zcmZuv&x;c=6n>eROn=z2u<9aq5pz^g@44N)PM)^)SJ?SSCeV09(*v5?|tu^FL_Dk)oK}RJiEV_d_(}>U9k$h z1aoP@84w`o5j;c^)!+(j0r570_ziENl3wgtE+CkM4S&h`aj*rk->}XuYVaQoUT9)` zrw#B|*(=nGGxt*+nNpW&*6A~)I*wVzaut~GS>_C4kcfcv2$KE|#6gUSchh#_&>}xa zjtd+jSQdI=yv6L=l>C@W$-6Wia>;ZedQ^>+=7SG#P%oMy zrA|$$DN{N~yIJ4i3Z*YI)?aqkC_PT3()~nmk=nMev^17wLZsSyrb0P35!zg)R5_|c znbtBn$~3n<>27CkKQOK6P}#jkEa|eSm3FcL7g|Nl7Z0Lli$qV;w6CJa`9^jZg&qxg z^ylcfx-}e0cc*!B1FLnL-odn7J=vd@Dktq}ZToYuEibM_2Ja6f6SECVnDFo@6FNJn zhvvdRuF_pYZfS7h)CLcwn<&hy+xZ9!%S+Ctcz1DH_vBSux|gAvHvRAsLSNz9uh2)= ye}YS8D6O5oo_Le?d2wfqzW^Tdx0P?DwfBX|`sDd}>BczB$ Date: Mon, 8 Dec 2025 11:37:39 +0000 Subject: [PATCH 4/8] generic --- .DS_Store | Bin 6148 -> 6148 bytes type/generic.py | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 type/generic.py diff --git a/.DS_Store b/.DS_Store index 7b3ce1fb87d4dc9ca9a9ba7811d2dd68d5812f70..b1ab0949dafe6bd9f9a3a89b02f336a146463ea3 100644 GIT binary patch delta 102 zcmZoMXffEJ&&J8ZP{L5jP{5En*^f3~3DcKz0g{S2WpzO}?Ihnw)gQ;N<+= z0tN&ipd&Zm#U&{xKMAOTk diff --git a/type/generic.py b/type/generic.py new file mode 100644 index 00000000..49daa317 --- /dev/null +++ b/type/generic.py @@ -0,0 +1,21 @@ +from dataclasses import dataclass +from typing import List + +@dataclass(frozen=True) +class Person: + name: str + age:int + children: list['Person'] + +fatma = Person(name="Fatma",age=12, children=[]) +aisha = Person(name="Aisha",age=10, children=[]) + +imran = Person(name="Imran",age=40, children=[fatma, aisha]) + + +def print_family_tree(person: Person) -> None: + print(person.name) + for child in person.children: + print(f"- {child.name} ({child.age})") + +print_family_tree(imran) \ No newline at end of file From bbf12eff93c92171f2c770ca05a89c39f83255c0 Mon Sep 17 00:00:00 2001 From: Aida Eslami Date: Mon, 8 Dec 2025 13:23:20 +0000 Subject: [PATCH 5/8] refactor --- type/refactor.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 type/refactor.py diff --git a/type/refactor.py b/type/refactor.py new file mode 100644 index 00000000..502526f6 --- /dev/null +++ b/type/refactor.py @@ -0,0 +1,53 @@ +from dataclasses import dataclass +from typing import List + +@dataclass(frozen=True) +class Person: + name: str + age: int + preferred_operating_systems: List[str] + + +@dataclass(frozen=True) +class Laptop: + id: int + manufacturer: str + model: str + screen_size_in_inches: float + operating_system: str + + +def find_possible_laptops(laptops: List[Laptop], person: Person) -> List[Laptop]: + possible_laptops = [] + for laptop in laptops: + + for os in person.preferred_operating_systems: + if laptop.operating_system.lower() == os.lower(): + possible_laptops.append(laptop) + + + return possible_laptops + + + + +people = [ + Person(name="Imran", age=22, preferred_operating_systems=["Ubuntu", "Arch Linux", "macOS", "Windows"]), + Person(name="Eliza", age=34, preferred_operating_systems=["Arch Linux", "macOS"]), +] + +laptops = [ + Laptop(id=1, manufacturer="Dell", model="XPS", screen_size_in_inches=13, operating_system="Arch Linux"), + Laptop(id=2, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system="Ubuntu"), + Laptop(id=3, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system="ubuntu"), + Laptop(id=4, manufacturer="Apple", model="macBook", screen_size_in_inches=13, operating_system="macOS"), +] + +for person in people: + possible_laptops = find_possible_laptops(laptops, person) + print("-----") + print(f"Laptops possible for {person.name}:") + for laptop in possible_laptops: + print(f"Possible laptop: {laptop.manufacturer} {laptop.id} {laptop.operating_system}") + + From f81a6d001095903bb66533e65ba8ef4e35edf3b1 Mon Sep 17 00:00:00 2001 From: Aida Eslami Date: Wed, 10 Dec 2025 11:08:14 +0000 Subject: [PATCH 6/8] Enum --- type/__pycache__/enum.cpython-313.pyc | Bin 0 -> 2139 bytes type/myEnum.py | 64 ++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 type/__pycache__/enum.cpython-313.pyc create mode 100644 type/myEnum.py diff --git a/type/__pycache__/enum.cpython-313.pyc b/type/__pycache__/enum.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c2bdfad4f14adfd85698faf269c7bd2e7247e8b GIT binary patch literal 2139 zcma)6O>7%g5Ps|Z@z2`MkK_E8Zj&}(L2E=?p|okCG&H46(<-l)TC}j**lTwid)K^O zBjQt}9O$u^O65cw zN~m%^)ZTl(lY&V{qQVdr`A3vYqq?ZeGVG!;U83rNbxxu2QSwk?iY~)95;RGBXfN%f z{nK)Qqyl7srn|^s2N~)j!*qm>!mcqyvJwmH5y&-u9;(B|qJe#^YsUinjjpZg(ge|? zdK_fz0M%7`d|G4)T>&(#Ck|?2NxcWMYkFc)3(~(Pl7ybnlSy(`I>@7u(nMymg;5!S zM+>HJ=F6t%fg#P?o_`kU{i5T3=g5aVfsF^mukKRJ{E^_?Zc1oOWB+UXU&>+!OYIO`C7$td@p%sMw&AZ-t*qtLDrc%IEDSjUft7mwAigHQ#S&|uG^6pg>rHL)g*3_12SNYN z^L23lFP@R{fM;k6nabT;Py+75EK-VOqFk9btG-)p^+8%5vI{(3F`Zh`%=0JhLpv@a(!}*be;VA6OpmJ$fwxRSTIYOJEU66g?<1`?9RFi8rnq%6wq%{XeUPvSDt++cfch&gc)(4#9SEFR9#abLJcNCEI$ z#|g=W7IAPKSvm353%m6mAu7=z@+3U6g^b9sG=_7ID`vH7IfabGG{jCI)?0Nw&t8J2 z?iSTiumBAfL%MjnXgdYtXfVTj9*3Vd17ejlhejIGz%TtHkCdj`_fnnMQYY4nFQ?|V zrskfjbIthp%lPD0d~*HTi}>4nGD(f@DkMJMkj4UfTR5h;G;5X1T)cOOw(yGUu`4Y9 zK%2Ln+E*EwjRM5RP~dmjF%(#03#n^iCvYXVRCD}V3+d-dt!-dAT)tARmMtExnE8)f zcNtpG%-^QRmNk6a_2eNBjEnlILw0v^Xx$do+LHrVkHY5|KEZ(c zdiqX>X05}nR&<$G4_(j}GJRa_jzY_0?Nh^>hDpTm)a@r7^efUGTppKgr&{xQ3{Tk} zZ9EDG?5Jw@Y`1CqP2gp-Qy{opWiW@@2Ymfa@W@Piz+Gl|op>4E0LWcY5QJaJi9g8D zUXp~=$0xUhp}#_+aB`P`*cVA?co)sR_$#k0jP4Q;9WR;#vM|1WZbNxCgP!pp2ZMh< z&2A3H$H#3B`xnru~$HGODg>bP};b^xzxzxmffhVhE~IS z{Un)cq)u-q&aB3E;(d+&iS790YIFzCfs5P8nN@WsoOpcU+1d4#?=EjHZ-qZyRd!Nu tZ4CV|wVj%7klr04HzLQL7QbEoX8Gx78xxJwmm2R}ZYUo-Cm#m=`ZwTW1s?za literal 0 HcmV?d00001 diff --git a/type/myEnum.py b/type/myEnum.py new file mode 100644 index 00000000..256d8459 --- /dev/null +++ b/type/myEnum.py @@ -0,0 +1,64 @@ +from dataclasses import dataclass +from enum import Enum +from typing import List + +class OperatingSystem(Enum): + MACOS = "macOS" + ARCH = "Arch Linux" + UBUNTU = "Ubuntu" + +@dataclass(frozen=True) +class Person: + name: str + age: int + preferred_operating_system: OperatingSystem + + +@dataclass(frozen=True) +class Laptop: + id: int + manufacturer: str + model: str + screen_size_in_inches: float + operating_system: OperatingSystem + + + + +def find_possible_laptops(laptops: List[Laptop], person: Person) -> List[Laptop]: + possible_laptops = [] + for laptop in laptops: + if laptop.operating_system == person.preferred_operating_system: + possible_laptops.append(laptop) + return possible_laptops + + + + +laptops = [ + Laptop(id=1, manufacturer="Dell", model="XPS", screen_size_in_inches=13, operating_system=OperatingSystem.ARCH), + Laptop(id=2, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system=OperatingSystem.UBUNTU), + Laptop(id=3, manufacturer="Dell", model="XPS", screen_size_in_inches=15, operating_system=OperatingSystem.UBUNTU), + Laptop(id=4, manufacturer="Apple", model="macBook", screen_size_in_inches=13, operating_system=OperatingSystem.MACOS), +] + + + +namePerson = input("enter your personal name: ") +try: + agePerson = input("enter your age: ") +except ValueError: + print("Invalid age. Age must be a number.") + exit() +try: + preferredOS = input("enter your preferred operating system: ") +except KeyError: + print("Invalid operating system entered. Please choose from: MACOS, ARCH, UBUNTU.") + exit() + +person=Person(name=namePerson, age=int(agePerson), preferred_operating_system=OperatingSystem[preferredOS]) +possible_laptops = find_possible_laptops(laptops, person) +print(f"Possible laptops for {person.name}: {possible_laptops}") + + + From 87cd1e28d2de814bfd25a336273fb3927ac7c711 Mon Sep 17 00:00:00 2001 From: Aida Eslami Date: Wed, 10 Dec 2025 11:43:55 +0000 Subject: [PATCH 7/8] MyType --- type/myType.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 type/myType.py diff --git a/type/myType.py b/type/myType.py new file mode 100644 index 00000000..d0e349de --- /dev/null +++ b/type/myType.py @@ -0,0 +1,40 @@ +def triple(number): + return number * 3 + +print(triple(10)) + +# Bank account functions + + +def open_account( name:str, amount:float): + balances["name"] = int(amount * 100 ) + + + + +def sum_balances(accounts): + total = 0 + for name, pence in accounts.items(): + print(f"{name} had balance {pence}") + total += pence + return total + +def format_pence_as_string(total_pence): + if total_pence < 100: + return f"{total_pence}p" + pounds = int(total_pence / 100) + pence = total_pence % 100 + return f"£{pounds}.{pence:02d}" + +balances = { + "Sima": 700, + "Linn": 545, + "Georg": 831, +} +open_account("Tobi", 9.13) +open_account("Olya", 7.13) + +total_pence = sum_balances(balances) +total_string = format_pence_as_string(total_pence) + +print(f"The bank accounts total {total_string}") \ No newline at end of file From f7aececeb89859dc6164f7851deec810f4697222 Mon Sep 17 00:00:00 2001 From: Aida Eslami Date: Thu, 11 Dec 2025 11:45:05 +0000 Subject: [PATCH 8/8] Inheritance and Composition --- type/inheritance | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 type/inheritance diff --git a/type/inheritance b/type/inheritance new file mode 100644 index 00000000..b5009a51 --- /dev/null +++ b/type/inheritance @@ -0,0 +1,97 @@ +from typing import Iterable, Optional + +class ImmutableNumberList: + def __init__(self, elements: Iterable[int]): + self.elements = [element for element in elements] + + def first(self) -> Optional[int]: + if not self.elements: + return None + return self.elements[0] + + def last(self) -> Optional[int]: + if not self.elements: + return None + return self.elements[-1] + + def length(self) -> int: + return len(self.elements) + + def largest(self) -> Optional[int]: + if not self.elements: + return None + largest = self.elements[0] + for element in self.elements: + if element > largest: + largest = element + return largest + + +class SortedImmutableNumberList(ImmutableNumberList): + def __init__(self, elements: Iterable[int]): + super().__init__(sorted(elements)) + + def largest(self) -> Optional[int]: + return self.last() + + def max_gap_between_values(self) -> Optional[int]: + if not self.elements: + return None + previous_element = None + max_gap = -1 + for element in self.elements: + if previous_element is not None: + gap = element - previous_element + if gap > max_gap: + max_gap = gap + previous_element = element + return max_gap + + +values = SortedImmutableNumberList([1, 20, 7, 13, 4]) +print(values.largest()) +print(values.max_gap_between_values()) + +unsorted_values = ImmutableNumberList([1, 19, 7, 13, 4]) +print(unsorted_values.largest()) +# print(unsorted_values.max_gap_between_values()). 'ImmutableNumberList' object has no attribute 'max_gap_between_values' + + + +class Parent: + def __init__(self, first_name: str, last_name: str): + self.first_name = first_name + self.last_name = last_name + + def get_name(self) -> str: + return f"{self.first_name} {self.last_name}" + + +class Child(Parent): + def __init__(self, first_name: str, last_name: str): + super().__init__(first_name, last_name) + self.previous_last_names = [] + + def change_last_name(self, last_name) -> None: + self.previous_last_names.append(self.last_name) + self.last_name = last_name + + def get_full_name(self) -> str: + suffix = "" + if len(self.previous_last_names) > 0: + suffix = f" (née {self.previous_last_names[0]})" + return f"{self.first_name} {self.last_name}{suffix}" + +person1 = Child("Elizaveta", "Alekseeva") +print(person1.get_name()) +print(person1.get_full_name()) +person1.change_last_name("Tyurina") +print(person1.get_name()) +print(person1.get_full_name()) + +person2 = Parent("Elizaveta", "Alekseeva") +print(person2.get_name()) +# print(person2.get_full_name()) 'Parent' object has no attribute 'get_full_name' +# person2.change_last_name("Tyurina") 'Parent' object has no attribute 'change_last_name' +print(person2.get_name()) +# print(person2.get_full_name()) 'Parent' object has no attribute 'get_full_name' \ No newline at end of file