В дополнение к вызовам функций * args и ** kwargs полезны в иерархиях классов, а также избегают писать метод __init__
в Python. Подобное использование можно увидеть в таких системах, как код Django.
Например,
def __init__(self, *args, **kwargs):
for attribute_name, value in zip(self._expected_attributes, args):
setattr(self, attribute_name, value)
if kwargs.has_key(attribute_name):
kwargs.pop(attribute_name)
for attribute_name in kwargs.viewkeys():
setattr(self, attribute_name, kwargs[attribute_name])
Подкласс может быть
class RetailItem(Item):
_expected_attributes = Item._expected_attributes + ['name', 'price', 'category', 'country_of_origin']
class FoodItem(RetailItem):
_expected_attributes = RetailItem._expected_attributes + ['expiry_date']
Затем подкласс создается как
food_item = FoodItem(name = 'Jam',
price = 12.0,
category = 'Foods',
country_of_origin = 'US',
expiry_date = datetime.datetime.now())
Кроме того, подкласс с новым атрибутом, который имеет смысл только для этого экземпляра подкласса, может вызвать базовый класс __init__
, чтобы отключить настройку атрибутов. Это делается через * args и ** kwargs. kwargs в основном используется для чтения кода с использованием именованных аргументов. Например,
class ElectronicAccessories(RetailItem):
_expected_attributes = RetailItem._expected_attributes + ['specifications']
# Depend on args and kwargs to populate the data as needed.
def __init__(self, specifications = None, *args, **kwargs):
self.specifications = specifications # Rest of attributes will make sense to parent class.
super(ElectronicAccessories, self).__init__(*args, **kwargs)
, который может быть установлен как
usb_key = ElectronicAccessories(name = 'Sandisk',
price = '$6.00',
category = 'Electronics',
country_of_origin = 'CN',
specifications = '4GB USB 2.0/USB 3.0')
. Полный код здесь здесь
Постарайтесь просто:
Элементы управления пользователя - это способ создания пользовательского, многоразового компонента. Пользовательский элемент управления может содержать другие элементы управления, но должен быть размещен в форме.
Формы Windows - это контейнер для элементов управления, включая пользовательские элементы управления. Хотя он содержит много похожих атрибутов, как пользовательский элемент управления, основной целью является управление элементами управления.
Они имеют лот , они оба получены из ContainerControl. Однако UserControl предназначен для дочернего окна, его необходимо разместить в контейнере. Форма была разработана как окно верхнего уровня без родителя.
Фактически вы можете превратить форму в дочернее окно, установив для свойства TopLevel значение false:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
var child = new Form2();
child.TopLevel = false;
child.Location = new Point(10, 5);
child.Size = new Size(100, 100);
child.BackColor = Color.Yellow;
child.FormBorderStyle = FormBorderStyle.None;
child.Visible = true;
this.Controls.Add(child);
}
}
Форма окна представляет собой контейнер для пользовательских элементов управления.
Самое большое различие - form.show дает другое окно, в то время как usercontrol не имеет функции, как всплытие без родителя. Остальные вещи одинаковы для обоих элементов управления, таких как beind, полученных из Scrollablecontrol.