class Student:
def __init__(self):
self._score = 0
@property
def score(self):
return self._score
@score.setter
def score(self, s):
if 0 <= s <= 100:
self._score = s
else:
raise ValueError('The score must be between 0 ~ 100!')
@score.deleter
def score(self):
del self._score
Yang = Student()
Yang.score=99
print(Yang.score)
# 99
Yang.score = 999
# ValueError: The score must be between 0 ~ 100!
Методы класса, методы объекта, статические методы
Используем декоратор @classmethod для методов, которые должны быть только у классов, но не их экземпляров
class Student:
def __init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name
self.nickname = None
def set_nickname(self, name):
self.nickname = name
@classmethod # get_from_string is a class method
def get_from_string(cls, name_string: str):
first_name, last_name = name_string.split()
return Student(first_name, last_name)
s = Student.get_from_string('yang zhou')
print(s.first_name) # yang
print(s.last_name) # zhou
# can't call instance method directly by class name
s2 = Student.set_nickname('yang')
# TypeError: set_nickname() missing 1 required positional argument: 'name'
Статические методы (объявленные как @staticmethod), могут быть вызваны как у объекта, так и у класса, но они не принимают ничего специфичного для класса (cls)
class Student:
@staticmethod
def test(a, b):
return a < b
Конструкторы
Следует разделять __new__ и __init__.
__new__: создает новый экземпляр (вызывается первым)
__init__: инициализирует новый экземпляр (вызывается вторым)
Чтобы нельзя было создать большое количество атрибутов, мы можем ограничить возможные атрибуты с помощью __slots__:
class Author:
__slots__ = ['name','hobby']
def __init__(self,name):
self.name = name
me = Author('Yang')
me.hobby='writing'
me.age=29
# AttributeError: 'Author' object has no attribute 'age'