Статические методы в Интерфейсе/Абстрактном классе

Вы можете использовать конструктор DataFrame с lists, созданный путем преобразования в numpy array с помощью values с tolist :

import pandas as pd

d1 = {'teams': [['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],
                ['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG'],['SF', 'NYG']]}
df2 = pd.DataFrame(d1)
print (df2)
       teams
0  [SF, NYG]
1  [SF, NYG]
2  [SF, NYG]
3  [SF, NYG]
4  [SF, NYG]
5  [SF, NYG]
6  [SF, NYG]

df2[['team1','team2']] = pd.DataFrame(df2.teams.values.tolist(), index= df2.index)
print (df2)
       teams team1 team2
0  [SF, NYG]    SF   NYG
1  [SF, NYG]    SF   NYG
2  [SF, NYG]    SF   NYG
3  [SF, NYG]    SF   NYG
4  [SF, NYG]    SF   NYG
5  [SF, NYG]    SF   NYG
6  [SF, NYG]    SF   NYG

И для нового DataFrame:

df3 = pd.DataFrame(df2['teams'].values.tolist(), columns=['team1','team2'])
print (df3)
  team1 team2
0    SF   NYG
1    SF   NYG
2    SF   NYG
3    SF   NYG
4    SF   NYG
5    SF   NYG
6    SF   NYG

Решение с apply(pd.Series) очень медленно:

#7k rows
df2 = pd.concat([df2]*1000).reset_index(drop=True)

In [89]: %timeit df2['teams'].apply(pd.Series)
1 loop, best of 3: 1.15 s per loop

In [90]: %timeit pd.DataFrame(df2['teams'].values.tolist(), columns=['team1','team2'])
1000 loops, best of 3: 820 µs per loop

10
задан jerhinesmith 18 August 2008 в 13:42
поделиться

10 ответов

При рассмотрении ответа я думаю вдоль следующих строк:

  • У Вас мог просто быть статический метод, который берет параметр типа и выполняет ожидаемую логику на основе типа.
  • Вы могли создать виртуальный метод в своей абстрактной основе, где Вы указываете SQL в реальном классе. Таким образом, это содержит весь общий код, который требуется и (например, exectuting команда и возврат объекта) при инкапсуляции битов "специалиста" (например, SQL) в sub классах.

Я предпочитаю вторую опцию, хотя, конечно, вниз Вам. При необходимости во мне, чтобы глубже проникнуть в детали, сообщите мне, и я буду рад редактировать/обновлять :)

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

Для универсального решения Вашего примера можно сделать это:

public static T RetrieveByID<T>(string ID)
{
     var fieldNames = getFieldNamesBasedOnType(typeof(T));
     QueryResult qr = webservice.query("SELECT "+fieldNames + " FROM "
                                     + tyepof(T).Name
                                     +" WHERE Id = '" + ID + "'");
     return (T) qr.records[0];
}
3
ответ дан 3 December 2019 в 20:45
поделиться

На вашем месте я старался бы избегать любых помех. По моему скромному мнению, я всегда заканчивал со своего рода проблемами синхронизации в будущем с помехами. Это сказанное Вы представляете классический пример универсальных шаблонов использования программирования. Я приму основанное на шаблоне решение, Грабят Медь, представленную в одном из сообщений выше.

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

Я лично, возможно, подверг бы сомнению, почему каждый из типов должен иметь статический метод перед ровным размышлением далее..

Почему бы не создать utlity класс со статическими методами, которые они должны совместно использовать? (например. ClassHelper.RetrieveByID(string id) или ClassHelper<ClassA>.RetrieveByID(string id)

По моему опыту, с подобными "контрольно-пропускными пунктами" проблемой не являются ограничения языка, но ограничения моего дизайна..

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

Вы не можете перегрузить методы путем варьирования просто типа возврата.

Можно использовать различные имена:

static AObject GetAObject(string id);
static BObject GetBObject(string id);

Или можно создать класс с кастингом операторов:

class AOrBObject
{ 
   string id;
   AOrBObject(string id) {this.id = id;}

   static public AOrBObject RetrieveByID(string id)
   {
        return new AOrBObject(id);
   }

   public static AObject explicit operator(AOrBObject ab) 
    { 
        return AObjectQuery(ab.id);
    }

   public static BObject explicit operator(AOrBObject ab)
    { 
        return BObjectQuery(ab.id);
    } 
}

Затем можно назвать его как так:

 var a = (AObject) AOrBObject.RetrieveByID(5);
 var b = (BObject) AOrBObject.RetrieveByID(5); 
2
ответ дан 3 December 2019 в 20:45
поделиться

Как ObjectA и AHelper связаны? AHelper.RetrieveByID() та же логика как BHelper.RetrieveByID()

Если Да, как насчет Служебного основанного на классе подхода (класс с общедоступными статическими методами только и никаким состоянием)

static [return type] Helper.RetrieveByID(ObjectX x) 
2
ответ дан 3 December 2019 в 20:45
поделиться

Как я отправляю обратную связь на Переполнении стека? Отредактировать мое исходное сообщение или отправить "ответ"? Так или иначе я думал, что это могло бы помочь дать пример того, что продолжается в AHelper. RetrieveByID () и BHelper. RetreiveByID ()

В основном оба из этих методов повышаются против стороннего веб-сервиса, который возвращается различный универсальный (castable) объект с помощью Метода запроса, который берет в строке псевдо-SQL как ее единственные параметры.

Так, AHelper. RetrieveByID (идентификатор строки) мог бы быть похожим

public static AObject RetrieveByID(string ID)
{
  QueryResult qr = webservice.query("SELECT Id,Name FROM AObject WHERE Id = '" + ID + "'");

  return (AObject)qr.records[0];
}

public static BObject RetrieveByID(string ID)
{
  QueryResult qr = webservice.query("SELECT Id,Name,Company FROM BObject WHERE Id = '" + ID + "'");

  return (BObject)qr.records[0];
}

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

О, и Ограбьте, я полностью согласен - это - больше, чем, вероятно, ограничение моего дизайна а не языка.:)

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

В C# 3.0 статические методы могут использоваться в интерфейсах, как будто они были частью их при помощи дополнительных методов, как с DumpToDatabase () ниже:

static class HelperMethods
 {  //IHelper h = new HeleperA();
    //h.DumpToDatabase() 
    public static void DumpToDatabase(this IHelper helper) { /* ... */ }

    //IHelper h = a.RetrieveByID(5)
    public static IHelper RetrieveByID(this ObjectA a, int id) 
     { 
          return new HelperA(a.GetByID(id));
     }

    //Ihelper h = b.RetrieveByID(5)       
    public static IHelper RetrieveByID(this ObjectB b, int id)
     { 
          return new HelperB(b.GetById(id.ToString())); 
     }
 }
1
ответ дан 3 December 2019 в 20:45
поделиться

Вы ищете полиморфное поведение? Затем Вы захотите интерфейсного и нормального конструктора. Что неинтуитивно о вызове конструктора? Если Вам не нужен полиморфизм (кажется, что Вы не используете его теперь), то можно придерживаться статических методов. Если это все обертки вокруг компонента поставщика, то, возможно, Вы могли бы попытаться использовать метод фабрики создать их как VendorBuilder. GetVendorThing ("A"), который мог возвратить объект типа IVendorWrapper.

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

marxidad Просто быстрый момент, который необходимо отметить, Justin уже сказал, что SQL варьируется много иждивенца на типе, таким образом, я работал на основании, что это могло быть что-то совершенно другой иждивенец на типе, следовательно делегировав его к рассматриваемым подклассам. Принимая во внимание, что Ваше решение связывает SQL ОЧЕНЬ плотно с Типом (т.е. это - SQL).

Положительная сторона rptony на возможной синхронизации выходит с помехами, один мне не удалось упомянуть, так спасибо :) Кроме того, его Rob Cooper (не Медь) BTW ;) :D (РЕДАКТИРОВАНИЕ: Просто мысль, я упомянул бы, что в случае, если это не была опечатка, я ожидаю это, таким образом, без проблем!)

0
ответ дан 3 December 2019 в 20:45
поделиться
Другие вопросы по тегам:

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