classStudent:def__init__(self): self._score =0@propertydefscore(self):return self._score@score.setterdefscore(self,s):if0<= s <=100: self._score = selse:raiseValueError('The score must be between 0 ~ 100!')@score.deleterdefscore(self):del self._scoreYang =Student()Yang.score=99print(Yang.score)# 99Yang.score =999# ValueError: The score must be between 0 ~ 100!
Методы класса, методы объекта, статические методы
Используем декоратор @classmethod для методов, которые должны быть только у классов, но не их экземпляров
classStudent:def__init__(self,first_name,last_name): self.first_name = first_name self.last_name = last_name self.nickname =Nonedefset_nickname(self,name): self.nickname = name@classmethod# get_from_string is a class methoddefget_from_string(cls,name_string:str): first_name, last_name = name_string.split()returnStudent(first_name, last_name)s = Student.get_from_string('yang zhou')print(s.first_name)# yangprint(s.last_name)# zhou# can't call instance method directly by class names2 = Student.set_nickname('yang')# TypeError: set_nickname() missing 1 required positional argument: 'name'
Статические методы (объявленные как @staticmethod), могут быть вызваны как у объекта, так и у класса, но они не принимают ничего специфичного для класса (cls)
classStudent:@staticmethoddeftest(a,b):return a < b
Конструкторы
Следует разделять __new__ и __init__.
__new__: создает новый экземпляр (вызывается первым)
__init__: инициализирует новый экземпляр (вызывается вторым)