Size: a a a

2020 December 01

v

vient in #ctfchat
штож, теперь надо смотреть, как определён __get__
источник

in #ctfchat
@vient кстати, в чем суть file name ?
1 - откуда был запущен или импортирован скрипт, 2 - просто для проверки, импортирован ли модуль?
источник

v

vient in #ctfchat
я не интересовался этим более подробно, чем нужно для использования if __name__ == '__main__'
источник

v

vient in #ctfchat
то есть вообще
источник

R

Rubikoid in #ctfchat
vient
я не интересовался этим более подробно, чем нужно для использования if __name__ == '__main__'
ну __name__ попроще
источник

v

vient in #ctfchat
точн, ещё
os.path.abspath(os.path.realpath(__file__))
источник

R

Rubikoid in #ctfchat
ну тут тоже всё в принципе норм
источник
2020 December 02

fs

falamous starstrider in #ctfchat
кажется методы байндятся отдельно при каждом адресовании и то что мы видели просто результат того что метод байндился, вычислялся айди, затем гарбадж коллектор его удалял и новый метод создавался на том же месте, поэтому is и == не возращали тру (тк для их вычисления создавалось 2 обьекта методов одновременноъ)
~ > python3
Python 3.8.6 (default, Nov 28 2020, 18:37:04)
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
...     def method(self):
...             pass
...
>>> a, b = A(), A()
>>> id(a.method) == id(b.method)
True
>>> a.method == b.method
False
>>> a.method is b.method
False
>>> c, d = a.method, b.method
>>> id(c) == id(d)
False
>>> c, d = a.method, a.method
>>> id(c) == id(d)
False
источник

R

Rubikoid in #ctfchat
falamous starstrider
кажется методы байндятся отдельно при каждом адресовании и то что мы видели просто результат того что метод байндился, вычислялся айди, затем гарбадж коллектор его удалял и новый метод создавался на том же месте, поэтому is и == не возращали тру (тк для их вычисления создавалось 2 обьекта методов одновременноъ)
~ > python3
Python 3.8.6 (default, Nov 28 2020, 18:37:04)
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
...     def method(self):
...             pass
...
>>> a, b = A(), A()
>>> id(a.method) == id(b.method)
True
>>> a.method == b.method
False
>>> a.method is b.method
False
>>> c, d = a.method, b.method
>>> id(c) == id(d)
False
>>> c, d = a.method, a.method
>>> id(c) == id(d)
False
Ну собственно сильно много нового по коду не видно
источник

fs

falamous starstrider in #ctfchat
Rubikoid
Ну собственно сильно много нового по коду не видно
посмотри последние 3 строки
источник

fs

falamous starstrider in #ctfchat
Rubikoid
Ну собственно сильно много нового по коду не видно
    descr = _PyType_Lookup(tp, name);

   f = NULL;
   if (descr != NULL) {
       Py_INCREF(descr);
       f = Py_TYPE(descr)->tp_descr_get;
       if (f != NULL && PyDescr_IsData(descr)) {
           res = f(descr, obj, (PyObject *)Py_TYPE(obj));
           if (res == NULL && suppress &&
                   PyErr_ExceptionMatches(PyExc_AttributeError)) {
               PyErr_Clear();
           }
           goto done;
       }
   }
вот логика ответсвенная за это в _PyObject_GenericGetAttrWithDict
источник

fs

falamous starstrider in #ctfchat
непонятно правда одно
источник

fs

falamous starstrider in #ctfchat
эта логика идет до проверки в словаре
источник

fs

falamous starstrider in #ctfchat
почему тогда можно перетирать методы
источник

R

Rubikoid in #ctfchat
falamous starstrider
посмотри последние 3 строки
(сори за скрин)
Я имел ввиду, что твой код не особо явно это показывает, и
Мне кажется, так это будет наглядней выглядеть
источник

fs

falamous starstrider in #ctfchat
с точки зрения производительности вообще пиздец
источник

R

Rubikoid in #ctfchat
falamous starstrider
с точки зрения производительности вообще пиздец
Я ф шоке
источник

R

Rubikoid in #ctfchat
Если чесно
источник

R

Rubikoid in #ctfchat
Они бы хоть кэш какой прикрутили
источник

fs

falamous starstrider in #ctfchat
Rubikoid
Я ф шоке
>>> class A():
...     def m(self):
...             print("1")
...
>>> a = A()
>>> a.m()
1
>>> A.m = lambda self : print("2")
>>> a.m()
2
зато можно так
источник