Ты два подчёркивания добавь :). А я ночью написал декоратор @private :).
Но не уверен что буду его использовать. Лучше действительно стандартизировать API и добавить врапперов в нужных местах. А код на костылях, увы, часто падает в неожиданных местах.
Это в питоне. PEP8, все дела. Для остального я использую отступы табами. Просто есть куча знакомых программеров, у которых отступы в IDE настроены на 2 символа, у многих 3, а есть даже 1. Чтоб не трепать друг-другу нервы, табы — лучшее решение.
уже можно стучать лысиной по паркету и хаять С++ - там даже внятной реализации private нету!
ну так через какой-нибудь reflection в java примерно так сделать можно
class ReflectHack{
private int Val=100;
public int getVal(){
return Val;
}
}
public class Main {
public static void main(String[] args){
ReflectHack H=new ReflectHack();
System.out.println(H.getVal());
try{
Field F=H.getClass().getDeclaredField("Val");
F.setAccessible(true);
F.setInt(H, 123);
}catch (Throwable e){
e.printStackTrace();
}
System.out.println(H.getVal());
}
}
и результат
100
123
Думаю и в C# так можно и в Scala и в D и в ещё каких-нибудь ruby. Эт чего получается, нету языков с нормальным private? Как страшно жить
Чорт, совсем забыл. Хотел по-быстрому пофиксить, поэтому сразу не отписался. Если завтра не подвезут мебель, то у меня наконец будут свободные выходные и обязательно займусь.
Без проблем :). Проверка идёт только в момент создания дочернего класса через метакласс. Вот так оно работает:
class PrivateFactory(type):
def __init__(self, cls_name, bases, namespace):
for field_name in namespace.keys():
for base in bases:
try:
base_field = getattr(base, field_name)
is_private = base_field.__private__
except AttributeError:
continue
if is_private:
raise Exception("Derived class cannot override private fields")
super(self.__class__, self).__init__(cls_name, bases, namespace)
Ну вот ты сам и ответил. :-) На сях надо больше напрягаться.
Ох, молодец. Из цепочки комментов выдернул один, а из него - кусок фразы. :)
Как будто я против питона...
Я же здесь, в этом треде писал уже, что при необходимости автоматизировать последовательность простых операций напишу скрипт на баше. Если операции посложнее, и нужен гуй, и всё это нужно «прям щас», то напишу на питоне (заметь!). А для специфических задач возьму С (или С++). Могу и какую-нибудь scheme привлечь.
А насчёт «на сях надо больше напрягаться» - этот этап я проходил лет 20 назад. Сейчас уже как-то «полегчало»...
долбишь по клавише пробел?)) Привязать 4 пробела на клавишу таб это дикий жуткий костыль назначение которого трудно понять. Не проще делать таб->пробелы редактором после написания кода?
Существуют всякие IDE вроде Eclipse. Но это так, между нами, по секрету.
Vala. По синтаксису похож на .NET (и соответственно относительно низкий порог вхождения), но по быстродействию на C (точнее равен ему, потому что на промежуточном этапе компиляции программа на Vala преобразуется в программу на Си). Компилируемый. Тесная интеграция с Glib, GObject и GTK.
Все языки, как и си, кроме байткодовых без jit и интерпретируемых, компилируются в машинный код целевой архитектуры. Но по быстродействию они отнюдь не равны си.
И что ты этим хотел сказать?? Про то что повесить 4 пробела на таб я писал. Хотя да, автоотступ сильно помогает. Чем плох таб? Надо поставил его размер на два и отступы небольшие, надо поставил размер на 8 и отступы гигантские. А пробелы натыкал везде 8 штук а другому хочется меньше и он должен 4 пробела удалить нажатием 4 раза на клавишу бекспейс(удалить таб одно нажатие)
Думаю и в C# так можно и в Scala и в D и в ещё каких-нибудь ruby. Эт чего получается, нету языков с нормальным private?
Haskell же :) Если модуль чего-то не экспортирует, то вне этого модуля это что-то использовать никак не получится (исключая возможность reverse engineering с binary patching).
Ну и вообще, инкапсуляция данных должна обеспечиваться системой модулей (пространствами имён, пакетами и т.п.), а не самими данными (классами, ADT, структурами и т.п.).
И что ты этим хотел сказать?? Про то что повесить 4 пробела на таб я писал. Хотя да, автоотступ сильно помогает. Чем плох таб? Надо поставил его размер на два и отступы небольшие, надо поставил размер на 8 и отступы гигантские. А пробелы натыкал везде 8 штук а другому хочется меньше и он должен 4 пробела удалить нажатием 4 раза на клавишу бекспейс(удалить таб одно нажатие)
Хм, а что мешает хакнуть тот же gevent или хотя бы отправить авторам фичреквест? Или оно там принципиально нереализуемо?
Да вот думаю как лучше сделать. Возможно что я сгустил краски и с использованием событий и очередей всё прекрасно делается. Признаться, я в первый раз взялся писать программу с таким гигантский кол-вом событий. Поживём - увидим.
#include <stdio.h>
class A{
int x;
public:
virtual int get_x(){ return x; }
};
int main( int argc, const char** argv ) {
A a;
printf("%i\n", a.get_x() );
*(int*)((char*)&a+8) = 123;
printf("%i\n", a.get_x() );
return 0;
}
Этот код демонстрирует что-угодно, но только не существование / отсутствие private
«Access specifiers do not necessarily control visibility, in that even private members may be visible to client external code. In some languages, an inaccessible but visible member may be referred to at run-time (for example, by a pointer returned from a member function), but an attempt to use it by referring to the name of the member from client code will be prevented by the type checker»
И вообще, где в этом коде хоть намек на один из важнейших механизмов ООП, а именно наследование? Приватные методы необходимо рассматривать именно в контексте этого механизма. Да и все остальные спецификаторы доступа должны рассматриваться в контексте именно наследования, а не плясок с указателями.