Используйте pd.MultiIndex.from_product
в качестве индекса в противном случае пустой фреймворк, а затем сбросьте его индекс, и все готово.
a = [1, 2, 3]
b = ["a", "b", "c"]
index = pd.MultiIndex.from_product([a, b], names = ["a", "b"])
pd.DataFrame(index = index).reset_index()
out:
a b
0 1 a
1 1 b
2 1 c
3 2 a
4 2 b
5 2 c
6 3 a
7 3 b
8 3 c
Использование прототипов:
function Box(color) // Constructor
{
this.color = color;
}
Box.prototype.getColor = function()
{
return this.color;
};
Скрытие «цвета» (чем-то напоминает закрытый член переменная):
function Box(col)
{
var color = col;
this.getColor = function()
{
return color;
};
}
Использование:
var blueBox = new Box("blue");
alert(blueBox.getColor()); // will alert blue
var greenBox = new Box("green");
alert(greenBox.getColor()); // will alert green
Вот шаблон, который я иногда использую для ООП-подобного поведения в JavaScript. Как видите, частные члены (как статические, так и экземпляры) можно моделировать с помощью замыканий. new MyClass ()
вернет объект со только свойствами, назначенными объекту this
и в объекте прототипа
класса.
var MyClass = (function () {
// private static
var nextId = 1;
// constructor
var cls = function () {
// private
var id = nextId++;
var name = 'Unknown';
// public (this instance only)
this.get_id = function () { return id; };
this.get_name = function () { return name; };
this.set_name = function (value) {
if (typeof value != 'string')
throw 'Name must be a string';
if (value.length < 2 || value.length > 20)
throw 'Name must be 2-20 characters long.';
name = value;
};
};
// public static
cls.get_nextId = function () {
return nextId;
};
// public (shared across instances)
cls.prototype = {
announce: function () {
alert('Hi there! My id is ' + this.get_id() + ' and my name is "' + this.get_name() + '"!\r\n' +
'The next fellow\'s id will be ' + MyClass.get_nextId() + '!');
}
};
return cls;
})();
] Меня спросили о наследовании с использованием этого шаблона, так что вот:
// It's a good idea to have a utility class to wire up inheritance.
function inherit(cls, superCls) {
// We use an intermediary empty constructor to create an
// inheritance chain, because using the super class' constructor
// might have side effects.
var construct = function () {};
construct.prototype = superCls.prototype;
cls.prototype = new construct;
cls.prototype.constructor = cls;
cls.super = superCls;
}
var MyChildClass = (function () {
// constructor
var cls = function (surName) {
// Call super constructor on this instance (any arguments
// to the constructor would go after "this" in call(…)).
this.constructor.super.call(this);
// Shadowing instance properties is a little bit less
// intuitive, but can be done:
var getName = this.get_name;
// public (this instance only)
this.get_name = function () {
return getName.call(this) + ' ' + surName;
};
};
inherit(cls, MyClass); // <-- important!
return cls;
})();
И пример использования всего этого:
var bob = new MyClass();
bob.set_name('Bob');
bob.announce(); // id is 1, name shows as "Bob"
var john = new MyChildClass('Doe');
john.set_name('John');
john.announce(); // id is 2, name shows as "John Doe"
alert(john instanceof MyClass); // true
Как вы можете видеть, классы правильно взаимодействуют друг с другом (у них общий статический идентификатор из MyClass
, метод announce
использует правильный метод get_name
и т. Д.)
Следует отметить необходимость в теневом копировании свойств экземпляра. Фактически вы можете заставить функцию наследовать
пройти через все свойства экземпляра (используя hasOwnProperty
), которые являются функциями, и автоматически добавить свойство super_ <имя метода>
. Это позволит вам вызвать this.super_get_name ()
вместо того, чтобы сохранять его во временном значении и вызывать его привязанным с помощью call
.
Для методов на прототипе вам не нужны Однако чтобы беспокоиться о вышеизложенном, если вы хотите получить доступ к методам прототипа суперкласса, вы можете просто вызвать this.constructor.super.prototype.methodName
. Если вы хотите сделать его менее подробным, вы, конечно, можете добавить удобные свойства. :)
this.super_get_name ()
вместо того, чтобы сохранять его во временном значении и вызывать его привязанным с помощью call
.
Для методов на прототипе вам не нужны Однако чтобы беспокоиться о вышесказанном, если вы хотите получить доступ к методам прототипа суперкласса, вы можете просто вызвать this.constructor.super.prototype.methodName
. Если вы хотите сделать его менее подробным, вы, конечно, можете добавить удобные свойства. :)
this.super_get_name ()
вместо того, чтобы сохранять его во временном значении и вызывать его привязанным с помощью call
.
Для методов на прототипе вам не нужны Однако чтобы беспокоиться о вышеизложенном, если вы хотите получить доступ к методам прототипа суперкласса, вы можете просто вызвать this.constructor.super.prototype.methodName
. Если вы хотите сделать его менее подробным, вы, конечно, можете добавить удобные свойства. :)
this.constructor.super.prototype.methodName
. Если вы хотите сделать его менее подробным, вы, конечно, можете добавить удобные свойства. :) вы можете просто вызвать this.constructor.super.prototype.methodName
. Если вы хотите сделать его менее подробным, вы, конечно, можете добавить удобные свойства. :)