-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathassignment.py
153 lines (116 loc) · 3.6 KB
/
assignment.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
from datetime import datetime
import math
class Person:
def __init__(self, first_name, last_name, birth_year):
self.birth_year = birth_year
self.first_name = first_name
self.last_name = last_name
self.bonus = 0.1
self.base_salary = 50000
def __str__(self):
return f"Person(age={self.age}, first_name={self.first_name}, last_name={self.last_name})"
@property
def age(self):
return datetime.now().year - self.birth_year
@property
def birth_year(self):
return self._birth_year
@birth_year.setter
def birth_year(self, value):
if isinstance(value, int):
self._birth_year = value
else:
raise ValueError("Birth year must be an integer")
def set_birth_year(self, value):
self.birth_year = value
@property
def full_name(self):
return f"{self.first_name} {self.last_name}"
@full_name.setter
def full_name(self, value):
self.first_name, self.last_name = value.split()
@property
def salary(self):
return self.bonus * self.base_salary + self.base_salary
@property
def bonus(self):
return self._bonus
@bonus.setter
def bonus(self, value):
if isinstance(value, (int, float)):
self._bonus = value
else:
raise ValueError("Bonus must be a real number")
@property
def base_salary(self):
return self._base_salary
@base_salary.setter
def base_salary(self, value):
if isinstance(value, (int, float)):
self._base_salary = value
else:
raise ValueError("Base salary must be a real number")
@property
def current_year(self):
return datetime.now().year
class Circle:
def __init__(self, radius):
self.radius = radius
@property
def radius(self):
return self._radius
@radius.setter
def radius(self, value):
if isinstance(value, (int, float)) and value > 0:
self._radius = value
self._area = math.pi * self.radius**2
self._diameter = 2 * self.radius
else:
raise ValueError("Radius must be a positive real number")
def set_radius(self, value):
self.radius = value
@property
def area(self):
return self._area
@property
def diameter(self):
return self._diameter
class Vehicle:
vehicle_count = 0
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
Vehicle.vehicle_count += 1
@classmethod
def get_vehicle_count(cls):
return cls.vehicle_count
@staticmethod
def classify_vehicle(vehicle_type):
return f"This is a {vehicle_type}"
class ElectricVehicle(Vehicle):
@staticmethod
def classify_vehicle(vehicle_type):
return f"This is an electric {vehicle_type}"
class DynamicClass:
static_value = 0
def __init__(self):
self._dynamic_attr = {}
def dynamic_attr(self, name, value):
self._dynamic_attr[name] = value
def __getattr__(self, name):
if name in self._dynamic_attr:
return self._dynamic_attr[name]
else:
raise AttributeError(
f"'{self.__class__.__name__}' object has no attribute '{name}'"
)
class ValidatedAttribute:
@property
def value(self):
return self._value
@value.setter
def value(self, value):
if not isinstance(value, int) or not value > 0:
raise ValueError(f"{value} must be a positive integer")
self._value = value