Вы сомневаетесь со специальными методами и специальными признаками

В python используются так называемые специальные признаки как __ ямс __, так что один день спросил меня, потому что я не могу использовать этот метод следующей формы:

.name

то же самое происходит с методами, методами как __ str __ (), потому что я не могу использовать их как .str (), или потому что, если print () Вы функция как str (), потому что () я не могу делать бруски print низкими?-> __ print () __

В Интернете я узнал о чем-то, названном методы и специальные признаки.

Так что уже объясненная мое сомнение, Вы могли бы говорить мне:

  • каково различие между методами и специальными признаками с методами и нормальными признаками?

  • когда использовать специальные методы взамен нормальных методов, и когда использовать специальные признаки вместо нормальных признаков?

  • потому что использовать методы и специальные признаки?

  • потому что в python эта __ str __ (), если уже Вы существуете str ()?

  • потому что print () не может высказываться между низкими брусками, поскольку также __ ямс __ не может высказываться без них?

  • потому что их называются методы и специальные признаки (В которые приходит "специальный")?

0
задан 10.11.2019, 04:57
2 ответа

Признаки и mГ©todos специальные (magic methods) они используют двойную порцию guiГіn низко например:

__name__
__str__
__init__
__call__
__del__

, Когда ты используешь .name , ты называешь признак объекта например:

class Persona:
    nombre = "Carlos"

, Чтобы призывать к признаку имя utlizamos точка asГ - .name после instanciar Persona:

>>> p = Persona()
>>> print(p.name)
Carlos

Предыдущий cГіdigo imprimirГЎ контент признака nombre из объекта p.

Пайтон utliza mГ©todos и специальные признаки, чтобы называть их в неких случаях например, когда инициализируется объект, он называет __init__. Другой пример, - когда python он называет __name__, чтобы знать, распространяется ли программа как главная программа, или если его один mГіdulo импортируемый. Каков

- различие между ними mГ©todos и специальные признаки с ними mГ©todos и нормальные признаки?

podrГ-am говорить, что они mГ©todos нормальные они звонят в них mГ©todos специальные:

Например mГ©todo len() называет в mГ©todo специально __len__ из объекта. Если мы изменяли mГ©todo специально __len__ из класса Человек следующей формы:

class Persona:
    def __len__():
        return 1

получает следующий результат, когда используют ее funciГіn len():


>>> p = Persona()
>>> len(p)
1

, потому что использовать mГ©todos и специальные признаки?

, Когда ты захочешь изменить поведение объекта как в предыдущем примере

, потому что они называются mГ©todos и специальные признаки (В которые приходит "специальный")

использованы, чтобы определять характеристики объекта и python он это использует внутри.

0
ответ дан 01.12.2019, 12:10
  • 1
    что len () и print () они глобальные, что имеет общее, с которым len () он был специальным и print (), нет? – Carlos Bello 10.11.2019, 05:47
  • 2
    глобальные и частные? – Carlos Bello 10.11.2019, 05:47
  • 3
    def len (var): return 1//я не могу делать это вместо __ len __ ()??? – Carlos Bello 10.11.2019, 06:02

В действительности если ты можешь делать это, хотя нужно добавлять немного cГіdigo к классу

class DottetAttrib(object):

внутри __getattr__ пламя с теми же самыми parГЎmetros

  def __getattr__(self, name):

    # Comprobamos si existe el atributo, de existir lo devolvemos
    if name in self.__dir__():
      print(name, ' in dir')
      return self.__getattribute__(name)

    # Comprobamos si existe el attributo privado, si existe lo devolvemos
    if f"__{name}__" in self.__dir__():
      return self.__getattribute__(f"__{name}__")

    # si no se da ninguno de los casos anteriores, devolvemos un error
    else:
      raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")

a = DottetAttrib()
b = ''
print(a.dict)
print(a.dir())
print(a.__dir__())
print(b.__class__.__name__)

# Estos dos dan error de atributo
print(a.hola)
print(b.__name__)

Однако Вїque последуй за __getattribute__ с этими mГ©todos? У Пайтона есть специальное поведение с этими mГ©todos (ahГ - Ваше имя) например print(clase) называет в mГ©todo специально __repr__ for называет __iter__ и asГ - больше вещей.

Существует одна metodologГ - в так называемую перегрузку операторов, ты можешь видеть это например в модуле Path ее librerГ - в pathlib, где чтобы объединять каталоги, достаточно несмотря на то, что "разделяет" пример:

ruta = Path('/home/usuario")
documentos = ruta / 'Documentos' # quedaría como '/home/usuario/Documentos'

этого добиваются повторно определяя mГ©todo __truediv__, который является тем, который призывает python разделять

, если мы добавляем метод __truediv__ к классу DottetAttrib, мы можем делать то же самое:

def __truediv__(self, value):
    return f'Quieres que divida por {value}'

print(a / 7)
print(a / 'otra cosa')

зная, поскольку они функционируют они mГ©todos специальные, ты можешь делать очень забавные вещи

0
ответ дан 01.12.2019, 12:10