переменная в дочернем классе скрыта, несмотря на ссылку дочернего класса [duplicate]

Вы можете использовать pandas.to_datetime() , как рекомендовано в документации для pandas.read_csv() :

Если столбец или индекс содержит непроверяемая дата, весь столбец или индекс будут возвращены без изменений как тип данных объекта. Для нестандартного синтаксиса datetime используйте pd.to_datetime после pd.read_csv.

Демо:

>>> D = {'date': '2013-6-4'}
>>> df = pd.DataFrame(D, index=[0])
>>> df
       date
0  2013-6-4
>>> df.dtypes
date    object
dtype: object
>>> df['date'] = pd.to_datetime(df.date, format='%Y-%m-%d')
>>> df
        date
0 2013-06-04
>>> df.dtypes
date    datetime64[ns]
dtype: object

21
задан pts 29 June 2018 в 21:40
поделиться

5 ответов

Да, класс B наследует метод foo. Но переменная x в B скрывает x в A; он не заменяет его.

Это проблема области. Метод foo в A видит только переменные, которые находятся в области видимости. Единственной переменной в области видимости является переменная экземпляра x в A.

Метод foo наследуется, но не переопределяется, в B. Если вы должны явно переопределить foo с тем же самым точным кодом:

class B extends A
{
    int x = 6;

    @Override
    void foo()
    {
        System.out.println(this.x);
    }
}

Тогда переменная, которая была бы в области видимости при упоминании this.x, была бы B x , и 6 будет напечатано. Хотя текст метода одинаков, ссылка отличается от области видимости.

Кстати, если вы действительно хотели сослаться на A x в классе B, вы может использовать super.x.

18
ответ дан rgettman 16 August 2018 в 02:45
поделиться
  • 1
    Поэтому мне кажется, что скрытие данных - это ловушка. Если нужно скрыть переменную, они должны переопределить все методы, которые касаются этой переменной ... – Parzival 29 June 2018 в 17:38
  • 2
    Им придется переопределить все методы, которые касаются этой переменной, только если они захотят заменить переменную суперкласса другой переменной. В лучшем случае это сбивает с толку, когда наследуемые поля скрыты. – rgettman 29 June 2018 в 17:41
1
ответ дан Anatolii 16 August 2018 в 02:45
поделиться

Когда вы вызываете

b.foo(); 

Он проверяет, отменяет ли B метод foo(), которого у него нет. Затем он выглядит на одном уровне до суперкласса A и вызывает этот метод.

Затем вы вызывали версию A foo(), которая затем выводит

this.x

Теперь A не может видеть версию B x.


Чтобы решить эту проблему, вы должны переопределить метод в B

class B extends A
{
    int x = 6;

    @Override
    void foo()
    {
        System.out.println(this.x);
    }

}

Теперь вызов

b.foo();

вызовет версию B foo(), и вы получите ожидаемый результат.

0
ответ дан Andreas DM 16 August 2018 в 02:45
поделиться

Поля не переопределяются в Java и подклассах с теми же именами полей, что и родительский класс, т. е. «только» поля родительского класса. Поэтому this.x относится к x, определенному в текущем классе: A. В то время как результат: 5.

Чтобы быть более точным: метод foo() наследуется подклассом B, но это не означает, что поведение унаследованного метода изменится в отношении полей экземпляров, на которые ссылаются, поскольку, поскольку указанные поля не являются overridable: выражение this.x, которое ссылается на поле A.x в методе foo(), ссылается на A.x.

Это то же самое, что и для двух предыдущих утверждений:

 B b = new B();
 System.out.println(b.x); // refers B.x -> 6
 System.out.println(((A)b).x); // refers A.x -> 5
 b.foo(); // refers under the hood A.x -> 5

Очень хороший ответ rgettman показывает, как вы можете преодолеть скрытие поля в подклассе. Альтернатива для преодоления скрытия основывается на создании поля экземпляра private (который рекомендуется) и предоставления метода, который возвращает значение. Таким образом, вы получаете преимущество от переопределяющего механизма, и скрытие поля больше не является проблемой для клиентов классов:

class A
{
    private int x = 5;

    int getX(){
        return x;
    }

    void foo()
    {
        System.out.println(this.getX());
    }
}
class B extends A
{
    private int x = 6;

    int getX(){
        return x;
    }
}
2
ответ дан davidxxx 16 August 2018 в 02:45
поделиться
  • 1
    getX() в B должен вернуть x – user7 27 July 2018 в 15:36
  • 2
    @ user7 О, спасибо за это. Не стесняйтесь редактировать сообщение в следующий раз. – davidxxx 27 July 2018 в 15:37

Ну, это из-за статической привязки.

1) Статическая привязка в Java происходит во время компиляции, тогда как динамическое связывание происходит во время выполнения.

2) частные методы , конечные методы и статические методы и переменные используют статическое связывание и связаны с компилятором, в то время как виртуальные методы связаны во время выполнения на основе объекта времени выполнения.

3) Статическое связывание использует информацию типа (класс в Java) для привязки во время динамического привязка использует Object для разрешения привязки.

4) Перегруженные методы связаны с использованием статической привязки, тогда как переопределенные методы связаны с использованием динамического связывания во время выполнения.

2
ответ дан Michel_T. 16 August 2018 в 02:45
поделиться
Другие вопросы по тегам:

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