Метод происходит от AbstractUser
:
class AbstractBaseUser(models.Model):
<b>@classmethod</b>
def normalize_username(cls, username):
return unicodedata.normalize('NFKC', force_text(username))
Это логично, поскольку, если бы каждая функция, определенная в классе, просто была бы доступна по имени, это привело бы к совершенно нестабильному коду. Представьте, что вы создаете функцию send_email
, и вдруг ваш коллега также создает такую функцию в другом классе, тогда какую функцию следует использовать?
Python позволяет писать функции в файле (следовательно, модуле), которые не привязаны к определенному классу, но тогда вам все равно нужно убедиться, какой из них вам нужен. Хороший язык программирования - однозначный , конечно, на уровне синтаксиса, но также в случае вызова функции должно быть понятно, какая функция вызывается.
Но вы можете сделать это более удобным, импортировав сам класс. Например:
from django.contrib.auth.models import <b>User</b>
class UserProxy (<b>User</b>):
foo = <b>User</b>.normalize_username ('abc') # OK
bar = <b>User</b>.normalize_username ('abc') # OK
class Meta:
proxy = True