Какова цель слова «я» в Python?

Просто для полноты и потому, что я не видел, чтобы кто-либо еще предлагал это:

Перед тем, как применить какие-либо сложные предложения, рассмотрите вопрос о том, действительно ли SQL-инъекция является проблемой в вашем сценарии.

Во многих случаях значение, предоставляемое IN (...), представляет собой список идентификаторов, которые были сгенерированы таким образом, что вы можете быть уверены, что инъекция невозможна ... (например, результаты предыдущий select some_id from some_table, где some_condition.)

Если это так, вы можете просто связать это значение и не использовать службы или подготовленный оператор для него или использовать их для других параметров этого запроса.

query="select f1,f2 from t1 where f3=? and f2 in (" + sListOfIds + ");";
1016
задан smci 29 June 2019 в 23:25
поделиться

8 ответов

Причина, по которой вам нужно использовать self. связано с тем, что Python не использует синтаксис @ для ссылки на атрибуты экземпляра. Python решил создавать методы таким образом, чтобы экземпляр, которому принадлежит метод, передавался автоматически, но не получал автоматически: первый параметр методов - это экземпляр, который вызывается. на. Это делает методы полностью такими же, как функции, и оставляет фактическое имя для использования на ваше усмотрение (хотя self - это соглашение, и люди обычно хмуро смотрят на вас, когда вы используете что-то еще.) self не является особенным для кода, это просто еще один объект.

Python мог бы сделать что-то еще, чтобы отличать нормальные имена от атрибутов - специальный синтаксис, такой как у Ruby, или требующий деклараций, как это делают C ++ и Java, или, возможно, что-то еще иное, - но этого не произошло. Python - все для того, чтобы сделать вещи явными, чтобы было очевидно, что к чему, и хотя он не делает это полностью везде, он делает это, например, с атрибутами. Вот почему при назначении атрибута экземпляра необходимо знать, какой экземпляр назначать, и поэтому для этого требуется self. .

686
ответ дан 19 December 2019 в 20:19
поделиться

сам действует так же как текущее имя объекта или экземпляр класса.

# Self explanation.


 class classname(object):

    def __init__(self,name):

        self.name=name
        # Self is acting as a replacement of object name.
        #self.name=object1.name

   def display(self):
      print("Name of the person is :",self.name)
      print("object name:",object1.name)


 object1=classname("Bucky")
 object2=classname("ford")

 object1.display()
 object2.display()

###### Output 
Name of the person is : Bucky
object name: Bucky
Name of the person is : ford
object name: Bucky
3
ответ дан 19 December 2019 в 20:19
поделиться

это явная ссылка на объект экземпляра класса.

-1
ответ дан 19 December 2019 в 20:19
поделиться

Наряду со всеми другими уже указанными причинами, он позволяет упростить доступ к переопределенным методам; вы можете вызвать Class.some_method (inst) .

Пример того, где это полезно:

class C1(object):
    def __init__(self):
         print "C1 init"

class C2(C1):
    def __init__(self): #overrides C1.__init__
        print "C2 init"
        C1.__init__(self) #but we still want C1 to init the class too
>>> C2()
"C2 init"
"C1 init"
20
ответ дан 19 December 2019 в 20:19
поделиться

Следующие отрывки взяты из документации Python о себе :

Как и в Modula-3, нет сокращений [в Python] для ссылки на члены объекта из его методов: функция метода - это объявлен с явным первым аргументом, представляющим объект, который неявно предоставляется вызовом.

Часто первый аргумент метода называется self. Это не более чем соглашение: имя self не имеет для Python особого значения. Обратите внимание, однако, что, не следуя соглашению, ваш код может быть менее читаемым для других программистов Python, и также возможно, что программа обозревателя классов может быть написана, которая полагается на такое соглашение.

Для получения дополнительной информации см. учебник документации Python по классам .

20
ответ дан 19 December 2019 в 20:19
поделиться

Возьмем простой векторный класс:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

Нам нужен метод, который вычисляет длину. Как бы это выглядело, если бы мы хотели определить его внутри класса?

    def length(self):
        return math.sqrt(self.x ** 2 + self.y ** 2)

Как он должен был бы выглядеть, если бы мы определяли его как глобальный метод / функцию?

def length_global(vector):
    return math.sqrt(vector.x ** 2 + vector.y ** 2)

Таким образом, вся структура остается прежней.Как я могу это использовать? Если на мгновение предположить, что мы не написали метод length для нашего класса Vector , мы могли бы сделать следующее:

Vector.length_new = length_global
v = Vector(3, 4)
print(v.length_new()) # 5.0

Это работает, потому что первый параметр length_global , может быть повторно использован как параметр self в length_new . Это было бы невозможно без явного я .


Другой способ понять необходимость явного self - это посмотреть, где Python добавляет некоторый синтаксический сахар. Если учесть, что, по сути, вызов типа

v_instance.length()

внутренне преобразуется в

Vector.length(v_instance)

, легко увидеть, где подходит self . Фактически, вы не пишете методы экземпляра в Python; то, что вы пишете, - это методы класса, которые должны принимать экземпляр в качестве первого параметра. Следовательно, вам нужно будет явно разместить параметр экземпляра.

414
ответ дан 19 December 2019 в 20:19
поделиться

self - объектная ссылка на сам объект, поэтому они одинаковы. Методы Python не вызываются в контексте самого объекта. self в Python может использоваться для работы с пользовательскими объектными моделями или чем-то подобным.

8
ответ дан 19 December 2019 в 20:19
поделиться

Мне нравится этот пример:

class A: 
    foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: [5]

class A: 
    def __init__(self): 
        self.foo = []
a, b = A(), A()
a.foo.append(5)
b.foo
ans: []
78
ответ дан 19 December 2019 в 20:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: