Там простой способ обеспечить это:
не связываться с частными членами других случаев тот же класс.
Серьезно - вы написали студенту
код.
Если вы пишете класс, у вас есть полный контроль над ним, поэтому, если вы не хотите, чтобы один объект мог изменить другой, не пишите в этой функциональности.
Классы часто используют частные переменные в других случаях для реализации эффективных функций сравнения и копирования.
ParseFile
, как вы заметили, просто «спускает» все - ничего хорошего для инкрементного разбора, который вы хотите сделать! Итак, просто подайте файл в синтаксический анализатор немного за раз, убедившись, что условно уступите управление другим потокам, как вы идете - например,
while True:
data = f.read(BUFSIZE)
if not data:
p.Parse('', True)
break
p.Parse(data, False)
time.sleep(0.0)
вызов time.sleep (0.0)
- это способ Питона сказать «уступить другим потокам, если они готовы и ждут»; метод Синтаксический анализ
документирован здесь .
Второй пункт - это, забудьте о блокировках для этого использования! -- используйте вместо этого Queue.Queue , это внутренне многопоточный и почти неизменно лучший и простой способ координации нескольких потоков в Python. Просто создайте экземпляр Queue
q
, q.put (имя)
в нем и включите блок рабочих потоков в q.get ()
, ожидая получения дополнительной работы - это ТАК просто!
(Существует несколько вспомогательных стратегий, которые можно использовать для координации завершения рабочих потоков, когда для них больше нет работы, но простейшие, отсутствующие особые требования заключаются в том, чтобы просто сделать их демонными потоками, так что все они завершаются, когда основной поток делает - см. документы ).
-121--4196158-Второй подход имеет некоторые преимущества, такие как
Самый простой способ обеспечить это - программировать на интерфейс, например:
class Program
{
static void Main(string[] args)
{
IStudent s1 = new Student();
IStudent s2 = new Student();
s1.ExamineStudentsMembers(s1);
}
}
public interface IStudent
{
void ExamineStudentsMembers(IStudent anotherStudent);
}
public class Student : IStudent
{
private string _studentsPrivateMember;
public Student()
{
_studentsPrivateMember = DateTime.Now.Ticks.ToString();
}
public void ExamineStudentsMembers(IStudent anotherStudent)
{
Console.WriteLine(anotherStudent._studentsPrivateMember);
}
}
Компиляция больше не будет выполняться из-за попытки доступа к частному полю со стороны участников.
Если вы намереваетесь изучить информацию о данной студенческой информации, то я бы изменил метод статическим:
public static void ExamineStudentsMembers(Student student)
{
Console.WriteLine(student._studentsPrivateMember);
}
вы тогда использовали Student.ExaminestudustudentsMembers (S1)
. Использование S1.ExaminestudentsMembers (S2)
будет недействительным.
Если это не назначаемое цель, я бы переписал метод как:
public void ExamineStudentsMembers()
{
Console.WriteLine(_studentsPrivateMember);
}
вышеупомянутое, тогда будет использоваться письмом S1.ExaminestudentsMembers ()
Я думаю, что будет джава эквивалентна чему-то вроде следующего php
$my_numbers = range(0,100);
echo implode($my_numbers, ' ');
, что позволяет избежать рекурсии, циклов, управляющих операторов и т.д.
-121--1851138-Эта ошибка возникает при попытке добавить поле или члена непосредственно в пространство имен. Учитывая, что он указывает на app.config, вполне вероятно, что VS находится в плохом состоянии. Попробуйте закрыть и снова открыть Visual Studio и проверить, устранена ли ошибка.
Неудача при попытке перестроить и отправить результаты из окна вывода сборки на ваш вопрос.
-121--1843418- Я не уверен, что он должен работать в этом пути, но вы получаете доступ к this.value
и this.name
в одном и том же обратном вызове. Предполагается, что этот
ссылается на event.currentTarget
, который в данном случае является элементом SELECT.
В этом случае this.value
будет неопределенным, но вместо этого можно попробовать использовать $ (this) .val ();
.
Вы пытались утешить переменные?
-121--4067287-Как указано выше, сеансы, файлы cookie и IP-адреса неэффективны - злоумышленник может манипулировать всеми.
Если вы хотите предотвратить атаки грубой силы, то единственное практическое решение - основывать количество попыток на предоставленном имени пользователя, однако обратите внимание, что это позволяет злоумышленнику осуществлять DOS сайта, блокируя действительные пользователи от входа в систему.
например.
$valid=check_auth($_POST['USERNAME'],$_POST['PASSWD']);
$delay=get_delay($_POST['USERNAME'],$valid);
if (!$valid) {
header("Location: login.php");
exit;
}
...
function get_delay($username,$authenticated)
{
$loginfile=SOME_BASE_DIR . md5($username);
if (@filemtime($loginfile)<time()-8600) {
// last login was never or over a day ago
return 0;
}
$attempts=(integer)file_get_contents($loginfile);
$delay=$attempts ? pow(2,$attempts) : 0;
$next_value=$authenticated ? 0 : $attempts + 1;
file_put_contents($loginfile, $next_value);
sleep($delay); // NB this is done regardless if passwd valid
// you might want to put in your own garbage collection here
}
Обратите внимание на то, что эта процедура, как написано, утекает информацию о безопасности, т.е. кто-то, атакующий систему, может увидеть, когда пользователь войдет в систему (время ответа на попытку злоумышленников снизится до 0). Можно также настроить алгоритм так, чтобы задержка вычислялась на основе предыдущей задержки и метки времени в файле.
HTH
C.
-121--1018877-Мне нравится вторая точка, вы можете смотреть, но не трогайте этих частных членов.
Забавно, что вы должны сказать, что я знал учителя один раз, и он сказал, что у него часто были проблемы с решением, какие классы нормально смотреть на членов и с какими из них он может на самом деле играть.
Доступ к частным данным брата, может показаться неверным, когда сформулировано как:
public void ExamineStudentsMembers(Student anotherStudent) {
//this seems very wrong
Console.WriteLine(anotherStudent._studentsPrivateMember);
}
, однако, не кажется таким нечетным для методов, которые требуют такой функциональности. Какие методы требуют доступа к личным данным брата? Методы сравнения (в частности, равны) и объекты в структуре данных (скажем, дерево или связанный список).
Методы сравнения часто сравнивают частные данные напрямую, а не только публичные данные.
Для класса узлов, которые составляют связанный список, граф или дерево, возможность доступа к личным данным брата, является именно то, что необходимо. Код в знаете (часть класса) может воспользоваться структурой данных, но код вне структуры данных не может коснуться внутренних органов.
Интересно отметить, что эти два случая менее распространены в повседневной программировании, чем когда эта языковая функция была впервые разработана. Вернувшись в 1990-х и начале 2000-х годов, в C ++ было бы гораздо более распространено для создания пользовательских структур данных и методов сравнения. Возможно, это хорошее время для пересмотра частных членов.
Нет, это необходимо, код метода не специфичен для экземпляра, оно зависит только для типа объекта. (виртуальные методы) или объявленный тип переменной (для не виртуальных методов). Нестатические поля, с другой стороны, являются специфическими к примеру ... вот где у вас есть изоляция уровня экземпляра.
Единственная разница между статическим методом и нестатическим способом заключается в том, что статический метод не допускается доступа к другим экземпляру (нестатическими) методами или полями. Любой метод, который может быть сделан статическим без изменений, не будет никак не затронут, сделав его статическим, за исключением того, чтобы заставить компилятор бросать ошибки в любом месте, который его называли, используя синтаксис на основе экземпляра.
Область объекта не никогда не подразумевает безопасность - когда-либо! Это роль ОС для обеспечения безопасности времени выполнения. Это ошибка для разработки системы, которая опирается на обстоятельную область на языке, чтобы ограничить доступ экземпляра объекта выполнения объекта. Если бы это было не так, то все не оооязычные языки, по определению, не защищены.
Объект - это просто часть данных; Класс содержит функциональность. Метод участника - это просто приятный трюк, играющий компилятор; Это действительно больше похоже на статический метод с подразумеваемым аргументом (как методы расширения). С этим в виду, защита объектов друг от друга не имеет никакого смысла; Вы можете защищать только классы друг от друга. Так что естественно, что это работает таким образом.