Предоставляя .hash
средство получения свойств, вы можете создать именно то поведение, которое вам нужно. Фактическое значение hash
будет «скрыто» как ._hash
, что является обычной практикой в Python:
class File:
def __init__(self, filename, content):
self.filename = filename
self.content = content
self._hash = None
@property
def hash(self):
if self._hash is None:
# do some hashing here
self._hash = 'some hash'
return self._hash
f = File('myfile', 'some content')
print(f.hash)
Конечно, у вас могут быть и другие условия, когда вам нужно пересчитать хеш это не должно быть if self._hash is None
. И вы также можете просто сбросить хэш, когда он должен быть пересчитан. Например, возможно, ваш хэш изменяется при изменении .content
:
class File:
def __init__(self, filename, content):
self.filename = filename
self._content = content
self._hash = None
@property
def hash(self):
if self._hash is None:
# do some hashing here
self._hash = f'some hash based on {self._content}'
return self._hash
@property
def content(self):
return self.content
@content.setter
def content(self, value):
self._content = value
self._hash = None
f = File('myfile', 'some content')
print(f.hash)
f.content = 'changed content'
print(f.hash)
Если у Вас есть использование переменных'?'
int temp = 75;
PreparedStatement pstmt = con.prepareStatement(
"UPDATE test SET num = ?, due = now() ");
pstmt.setInt(1, temp);
pstmt.executeUpdate():
Производит sql statment, который похож:
UPDATE test SET num = 75, due = now();
Вы не должны использовать заполнителей в PreparedStatement. Что-то как:
PreparedStatement stmt = con.prepareStatement("select sysdate from dual");
работал бы просто великолепно. Однако Вы не можете использовать заполнителя и затем связать вызов функции с ним. Что-то вроде этого не может использоваться для вызывания sysdate функции:
PreparedStatement stmt = con.prepareStatement("select ? from dual");
stmt.setSomethingOrOther(1, "sysdate");
Если у Вас есть переменная, которая прибывает из ввода данных пользователем, важно, чтобы Вы использовали? вместо того, чтобы связывать строки. Пользователи могли бы ввести строку злонамеренно, и если Вы отбрасываете строку прямо в SQL, это может выполнить команду, которую Вы не предназначали.
Я понимаю, что этот злоупотребляется, но это говорит это отлично:
Если Вы называете созданными в функциях Вашего SQL-сервера, затем используют PreparedStatement.
Если Вы называете хранимые процедуры, которые были загружены на Ваш SQL-сервер, затем используют CallableStatement.
Используйте вопросительные знаки в качестве заполнителей для параметров функции/процедуры, что Вы - передающие и функциональные возвращаемые значения, которые Вы получаете.