Пять важных понятий, необходимых для быстрого старта в python ооп
Содержание:
- Краткое введение в ООП
- Наследование классов
- Краткий обзор ооп python
- Inheritance
- Prescriptive: Naming Conventions
- Вопросы пользователей по теме Python
- Дескрипторы
- Класс Python
- Defining a Class
- Создание объекта
- Создание Вложенных Классов В Python
- Mutable default values
- How to Check an Object’s Class
- Changes to raise
- Переопределение метода
- Descriptive: Naming Styles
- Готовимся к моделированию
Краткое введение в ООП
Объектно-ориентированное программирование (ООП) – технология разработки сложного программного обеспечения, в которой программа строится в виде совокупности объектов и их взаимосвязей.
Объединение данных и действий, производимых над этими данными, в единое целое, которое называется объектом – является одним из основных принципов ООП.
Основными понятиями являются понятие класса и объекта.
Класс является типом данных, определяемым пользователем и представляет собой структуру в виде данных и методов для работы с данными.
Формально Класс — это шаблон, по которому будет сделан объект.
Объект является экземпляром класса. Объект и экземпляр - это одно и то же.
Вот пример. Форма для изготовления печенья – это класс, а само печенье это объект или экземпляр класса, т.е. это конкретное изделие. Печенье имеет размеры, цвет, состав – это атрибуты класса. Также в классе описываются методы, которые предназначены для чтения или изменения данных объекта.
В Python характеристики объекта, называются атрибутами, а действия, которые мы можем проделывать с объектами, — методами. Методами в Python называют функции, которые определяются внутри класса.
Объект = атрибуты + методы
Наследование классов
Вместо того, чтобы начинать с нуля, вы можете создать класс, выведя его из ранее существовавшего класса, перечислив родительский класс в скобках после имени нового класса.
Дочерний класс наследует атрибуты своего родительского класса, и вы можете использовать эти атрибуты, как если бы они были определены в дочернем классе. Дочерний класс также может переопределять элементы данных и методы родительского класса.
Синтаксис
Производные классы объявляются так же, как их родительский класс; однако список базовых классов для наследования дается после имени класса
class SubClassName (ParentClass1): 'Optional class documentation string' class_suite
Пример
#!/usr/bin/python class Parent: # define parent class parentAttr = 100 def __init__(self): print "Calling parent constructor" def parentMethod(self): print 'Calling parent method' def setAttr(self, attr): Parent.parentAttr = attr def getAttr(self): print "Parent attribute :", Parent.parentAttr class Child(Parent): # define child class def __init__(self): print "Calling child constructor" def childMethod(self): print 'Calling child method' c = Child() # instance of child c.childMethod() # child calls its method c.parentMethod() # calls parent's method c.setAttr(200) # again call parent's method c.getAttr() # again call parent's method
Когда приведенный выше код выполняется, он дает следующий результат
Calling child constructor Calling child method Calling parent method Parent attribute : 200
Аналогичным образом вы можете управлять классом из нескольких родительских классов следующим образом:
class A: # define your class A ..... class B: # define your class B ..... class C(A, B): # subclass of A and B .....
Вы можете использовать функции issubclass () или isinstance (), чтобы проверить отношения двух классов и экземпляров.
- Issubclass ( к югу, вир) функция булева возвращает истину , если данный подкласс суб действительно подкласс суперкласса вир .
- Isinstance (объект, класс) Функция булева возвращает истину , если OBJ является экземпляром класса Class или является экземпляром подкласса класса
Краткий обзор ооп python
Программа/скрипт/код, написанные с использованием парадигмы объектно-ориентированного программирования, должны состоять из
- объектов,
- классов (описания объектов),
- взаимодействий объектов между собой, в результате которых меняются их свойства.
Что такое класс в ооп python?
Класс — это тип данных, состоящий из набора атрибутов (свойств) и методов — функций для работы с этими атрибутами.
Схематично класс можно представить следующим образом:
Для создания классов предусмотрена инструкция class. Тело класса состоит из блока различных инструкций.
class ИмяКласса: ПеременнаяКласса = Значение … def ИмяМетода(self, ...): self.ПеременнаяКласса = Значение … …
Методы в классах — это те же функции, которые принимают один обязательный параметр — self (с англ. можно перевести как «собственная личность»). Он нужен для связи с конкретным объектом.
Атрибуты класса — это имена переменных вне функций и имена функций. Эти атрибуты наследуются всеми объектами, созданными на основе данного класса. Атрибуты обеспечивают свойства и поведение объекта. Объекты могут иметь атрибуты, которые создаются в теле метода, если данный метод будет вызван для конкретного объекта.
Пример класса (ООП) на Python 3:
class Second: color = "red" form = "circle" def changecolor(self,newcolor): self.color = newcolor def changeform(self,newform): self.form = newform obj1 = Second() obj2 = Second() print (obj1.color, obj1.form) # вывод на экран "red circle" print (obj2.color, obj2.form) # вывод на экран "red circle" obj1.changecolor("green") # изменение цвета первого объекта obj2.changecolor("blue") # изменение цвет второго объекта obj2.changeform("oval") # изменение формы второго объекта print (obj1.color, obj1.form) # вывод на экран "green circle" print (obj2.color, obj2.form) # вывод на экран "blue oval"
Результат выполнения скрипта Python 3:
red circle red circle green circle blue oval
Inheritance
Inheritance is a key concept in object oriented programming. Classes can inherit from other classes. This basically means that you can create a class based on another class.
So we could create a class and base it on the class. We can then add attributes to that only customers will need, such as how much they’ve spent:
# Create the ‘Person’ class
class Person:
def __init__(self, id, firstname, lastname):
self.id = id
self.firstname = firstname
self.lastname = lastname
# Create the ‘Customer’ class (inherited from the ‘Person’ class)
class Customer(Person):
def __init__(self, id, firstname, lastname, totalspend):
Person.__init__(self, id, firstname, lastname)
self.totalspend = totalspend
def getDetails(self):
return «%s %s (customer %i) has spent %s in total.» % (self.firstname, self.lastname, self.id, self.totalspend)
# Instantiate the ‘Customer’ class
customer = Customer(
12,
«Peter»,
«Griffin»,
13000
)
# Print details
print(customer.getDetails())Result
Peter Griffin (customer 12) has spent 13000 in total.
Here we use a (slightly) stripped down version of our class (from the previous example), then we create a class based on it. We know it’s inherited from the class because we’ve put inside the parentheses (like this .
The class has a function called that returns a string of text about how much the customer has spent. This function uses the string formatting tokens and to insert the customer’s details into the right place. The details are provided after the symbol after the end of the string.
Prescriptive: Naming Conventions
Never use the characters ‘l’ (lowercase letter el), ‘O’ (uppercase
letter oh), or ‘I’ (uppercase letter eye) as single character variable
names.
In some fonts, these characters are indistinguishable from the
numerals one and zero. When tempted to use ‘l’, use ‘L’ instead.
Identifiers used in the standard library must be ASCII compatible
as described in the
of PEP 3131.
Modules should have short, all-lowercase names. Underscores can be
used in the module name if it improves readability. Python packages
should also have short, all-lowercase names, although the use of
underscores is discouraged.
When an extension module written in C or C++ has an accompanying
Python module that provides a higher level (e.g. more object oriented)
interface, the C/C++ module has a leading underscore
(e.g. _socket).
Class names should normally use the CapWords convention.
The naming convention for functions may be used instead in cases where
the interface is documented and used primarily as a callable.
Note that there is a separate convention for builtin names: most builtin
names are single words (or two words run together), with the CapWords
convention used only for exception names and builtin constants.
Names of type variables introduced in PEP 484 should normally use CapWords
preferring short names: T, AnyStr, Num. It is recommended to add
suffixes _co or _contra to the variables used to declare covariant
or contravariant behavior correspondingly:
from typing import TypeVar VT_co = TypeVar('VT_co', covariant=True) KT_contra = TypeVar('KT_contra', contravariant=True)
Because exceptions should be classes, the class naming convention
applies here. However, you should use the suffix «Error» on your
exception names (if the exception actually is an error).
(Let’s hope that these variables are meant for use inside one module
only.) The conventions are about the same as those for functions.
Modules that are designed for use via from M import * should use
the __all__ mechanism to prevent exporting globals, or use the
older convention of prefixing such globals with an underscore (which
you might want to do to indicate these globals are «module
non-public»).
Function names should be lowercase, with words separated by
underscores as necessary to improve readability.
Variable names follow the same convention as function names.
mixedCase is allowed only in contexts where that’s already the
prevailing style (e.g. threading.py), to retain backwards
compatibility.
Always use self for the first argument to instance methods.
Always use cls for the first argument to class methods.
If a function argument’s name clashes with a reserved keyword, it is
generally better to append a single trailing underscore rather than
use an abbreviation or spelling corruption. Thus class_ is better
than clss. (Perhaps better is to avoid such clashes by using a
synonym.)
Use the function naming rules: lowercase with words separated by
underscores as necessary to improve readability.
Use one leading underscore only for non-public methods and instance
variables.
To avoid name clashes with subclasses, use two leading underscores to
invoke Python’s name mangling rules.
Python mangles these names with the class name: if class Foo has an
attribute named __a, it cannot be accessed by Foo.__a. (An
insistent user could still gain access by calling Foo._Foo__a.)
Generally, double leading underscores should be used only to avoid
name conflicts with attributes in classes designed to be subclassed.
Note: there is some controversy about the use of __names (see below).
Constants are usually defined on a module level and written in all
capital letters with underscores separating words. Examples include
MAX_OVERFLOW and TOTAL.
Вопросы пользователей по теме Python
Класс Python islice не работает должным образом
Я пишу функцию, которая делит список на (почти) равные n распределений. Я хочу, чтобы эта функция возвращала генератор, но, похоже, возникла проблема с получением генератора. Функция отлично работает с итерациями. Взгляните на этот фрагмент:
import itertools
def divide_list(array, n, gen_length….
10 Авг 2021 в 05:23
Как округлить значение, выводимое моей функцией?
Я пишу код, который переводит узлы в км / ч.
def to_kmh(knots):
# Calculate the speed in km/h
return 1.852 * knots
# Write the rest of your program here
knots = float(input(‘Speed (kn): ‘))
if to_kmh(knots) <60:
print(f'{to_kmh(knots)} — Go faster!’)
elif to_kmh(knots) <100:
print(f'{to_km….
10 Авг 2021 в 03:13
Вставка строки по умолчанию, если в словаре нет значения
Я просматриваю список словарей и очищаю текст, чтобы избавиться от тегов <h2>, запятых и т. Д., Чтобы при помещении значений в фрейм данных pandas они просто отображали текст:
Вот функция на данный момент:
def first_clean(my_dict):
my_dict = {k: v for k, v in my_dict.items()}
for k, v in ….
10 Авг 2021 в 01:04
неожиданный результат с выражением присваивания
Я написал этот код, чтобы попробовать выражение присваивания:
foods= list()
while food := input(«your food?:») != «q»:
foods.append(food)
else:
print(foods)
Но после ввода сучи и риса после бега результат был
На самом деле такого результата не ожидал. Вы можете объяснить??….
10 Авг 2021 в 00:04
Почему при использовании ** kwargs появляется ключ kwargs?
Почему появляется {‘kwargs’:{‘1′:’a’, ‘2’:’b’}}, когда я запускаю test_func()? Я ожидал, что напечатает только это: {‘1′:’a’, ‘2’:’b’}.
Код:
class MyClass:
def __init__(self, **kwargs):
self.kwargs = kwargs
def test_func(self):
print(self.kwargs)
test_kwargs = {‘1′:’a’, ‘2….
9 Авг 2021 в 23:48
Печать всех элементов списка рядом с другой строкой
Я знаю, что о печати всех элементов строки много раз спрашивали и отвечали, но у меня возникли проблемы с поиском решения для выполнения этого в строке и рядом с другим оператором.
У меня следующая установка:
api_endpoints =
print(*api_endpoints, sep=’, ‘)
# candidate, emp….
9 Авг 2021 в 22:56
Объединить последовательные и перекрывающиеся диапазоны дат
Я надеюсь, что кто-нибудь здесь может мне помочь. Я перепробовал практически каждый поиск в Интернете, который только мог придумать, но не могу найти информацию, которая поможет мне получить то, что я ищу.
У меня есть несколько наборов данных, в которых периоды обслуживания клиентов являются послед….
9 Авг 2021 в 18:43
Обновление Pandas DataFrame и суммирование путем сопоставления индекса с несколькими столбцами из другой серии Pandas
У меня есть
df =
B TF C N
0 356 True 714 1
1 357 True 718 2
2 358 True 722 3
3 359 True 726 4
4 360 False 730 5
lt =
B C
356 714 223
360 730 101
400 800 200
Name: N, dtype: int64
type(lt) => pandas.core.series.Series
Мне нравится рассма….
9 Авг 2021 в 15:55
Разбиение набора данных на части и автоматическое вычисление средних значений этих фрагментов
Мне нужно создать небольшие фрагменты из набора данных. Затем вычислите среднее значение каждого фрагмента. Наконец, создайте список или массив для хранения всех этих средств. Моя цель — автоматизировать процесс. Например: мои данные . Если размер блока равен 3, ….
9 Авг 2021 в 01:20
Я получил пустые значения при преобразовании объекта в int с помощью pandas
Я пытаюсь преобразовать список столбцов из объекта str в целое число с помощью этого метода
df = pd.to_numeric(df, errors=’coerce’)
df = df.apply(np.int64)
NB: тип столбца A — объект
Но у меня такая ошибка ValueError: cannot convert float NaN to integer
Думаю, проблема в том, чт….
8 Авг 2021 в 20:44
Дескрипторы
Дескрипторы — объекты, которые умеют выполнять произвольный код, когда с ними происходят какие-то действия: доступ, изменение или удаление. Пример:
Дескриптор определяет методы, которые вызываются в момент, когда происходит доступ (или удаление или редактирование) инстанса дескриптора как атрибута другого класса.
Всё это работает благодаря методу : он находит нужный атрибут и проверяет, есть ли у него метод . Если есть — вызывает его, если нет — возвращает сам атрибут.
Именно через механизм дескрипторов осуществляется доступ к атрибутам класса и инстанса. , , и тоже работают благодаря дескрипторам.
Класс Python
К этому времени все вы должны были уже узнать о типах данных Python. Если вы помните, основные типы данных в Python относятся только к одному виду данных одновременно.
Как бы это было, если бы вы могли объявить тип данных, который сам содержится более одного типа данных и может работать с ними с помощью любой функции? Класс Python дает вам эту возможность.
Класс Python – это план, на котором создаются экземпляры класса.
Простая декларация класса Python
Вот очень базовая структура определения класса Python.
class ClassName: # list of python class variables # python class constructor # python class method definitions
Теперь давайте будем работать с реальными примерами.
#definition of the class starts here class Person: #initializing the variables name = "" age = 0 #defining constructor def __init__(self, personName, personAge): self.name = personName self.age = personAge #defining class methods def showName(self): print(self.name) def showAge(self): print(self.age) #end of the class definition # Create an object of the class person1 = Person("John", 23) #Create another object of the same class person2 = Person("Anne", 102) #call member methods of the objects person1.showAge() person2.showName()
Этот пример в значительной степени явно объяснил. Как мы знаем, линии, начинающиеся с «#», являются комментариями Python. Комментарии объясняют следующие исполняемые шаги. Этот код производит следующий вывод.
class Person:
Эта линия отмечает начало определения класса для класса «человека».
Переменные классов Python
#initializing the variables name = "" age = 0
«Имя» и «возраст» – два участника переменных класса «Человек». Каждый раз, когда мы объявляем объект этого класса, он будет содержать эти две переменные в качестве своего члена. Эта часть необязательна, поскольку они могут быть инициализированы конструктором.
Конструктор класса Python
#defining constructor def __init__(self, personName, personAge): self.name = personName self.age = personAge
Конструктор класса Python – это первый кусок кода, который будет выполнен при создании нового объекта класса.
В первую очередь конструктор может быть использован для поставки значений в переменных элемента. Вы также можете печатать сообщения в конструкторе, подтверждающем, был ли объект создан.
Мы узнаем большую роль конструктора, как только мы узнаем о наследнии питона. Метод конструктора начинается с def __init__. После этого первый параметр должен быть «я», так как он передает ссылку на экземпляр самого класса. Вы также можете добавить дополнительные параметры, как так, как он показан в примере. «Персонал» и «персонаж» – два параметра для отправки, когда должен быть создан новый объект.
Методы класса Python
#defining python class methods def showName(self): print(self.name)
Методы объявлены следующим образом:
def method_name(self, parameter 1, parameter 2, …….) statements…….. return value (if required)
В предварительно указанном примере мы видели, что метод печатает значение «Имя» этого объекта. Мы обсудим намного больше о методах Python в другой день.
Объект класса Python
# Create an object of the class person1 = Person("Richard", 23) #Create another object of the same class person2 = Person("Anne", 30) #call member methods of the objects person1.showAge() person2.showName()
Способ создания объектов в Python довольно прост. Сначала вы поместите имя нового объекта, за которым следует оператор назначения и название класса с параметрами (как определено в конструкторе).
Помните, номер и тип параметров должны быть совместимы с параметрами, полученными в функции конструктора.
Когда объект был создан, могут быть вызваны методы элементов, а атрибуты участников могут быть доступны (при условии, что они доступны).
#print the name of person1 by directly accessing the 'name' attribute print(person1.name)
Это все для оснований класса Python. Когда мы собираемся узнать о объектных объектах Python, такие как наследство, полиморфизм в последующих руководствах, мы узнаем больше о классе Python и его функции. До этого, счастливого кодирования и до свидания! Не стесняйтесь комментировать, если у вас есть какие-либо запросы.
Ссылка: Документация Python.org
Defining a Class
A class in Python can be defined using the keyword.
As per the syntax above, a class is defined using the keyword followed by the class name and operator after the class name, which allows you to continue in the next indented line to define class members.
The followings are class members.
A class can also be defined without any members. The following example defines an empty class using the keyword.
Example: Define Python Class
Copy
Class instantiation uses function notation. To create an object of the class, just call a class like a parameterless function that returns a new object of the class, as shown below.
Example: Creating an Object of a Class
Copy
Above, returns an object of the class, which is assigned to a local variable .
The class is an empty class because it does not contain any members.
Создание объекта
Мы увидели, что объект класса можно использовать для доступа к различным атрибутам.
Его также можно использовать для создания новых экземпляров объекта (создания экземпляров) этого класса. Процедура создания объекта аналогична вызову функции.
>>> harry = Person()
Это создаст новый экземпляр объекта с именем harry. Мы можем получить доступ к атрибутам объектов, используя префикс имени объекта.
Атрибуты могут быть данными или методом. Методы объекта ‒ это соответствующие функции этого класса.
Это означает, что поскольку Person.greet является объектом функции (атрибутом класса), Person.greet будет объектом метода.
class Person: "This is a person class" age = 10 def greet(self): print('Hello') # create a new object of Person class harry = Person() # Output: <function Person.greet> print(Person.greet) # Output: <bound method Person.greet of <__main__.Person object>> print(harry.greet) # Calling object's greet() method # Output: Hello harry.greet()
Выход
<function Person.greet at 0x7fd288e4e160> <bound method Person.greet of <__main__.Person object at 0x7fd288e9fa30>> Hello
Вы могли заметить параметр self в определении функции внутри класса, но мы вызвали этот метод просто как harry.greet() без каких-либо аргументов. Это все еще работало.
Это потому, что всякий раз, когда объект вызывает свой метод, сам объект передается в качестве первого аргумента. Итак, harry.greet() переводится как Person.greet (harry).
В общем случае вызов метода со списком из n аргументов эквивалентен вызову соответствующей функции со списком аргументов, который создается путем вставки объекта метода перед первым аргументом.
По этим причинам первым аргументом функции в классе должен быть сам объект. Это условно называется self. Его можно назвать иначе, но мы настоятельно рекомендуем следовать правилам.
Теперь вы ознакомились с объектом класса, объектом экземпляра, объектом функции, объектом метода и их различиями.
Создание Вложенных Классов В Python
В этом разделе мы в первую очередь сосредоточимся на создании вложенных классов. Для этого давайте рассмотрим пример.
class language: def __init__(self): .specification() def show(self): print("Language:", self.language) class specification: def __init__(self): def display(self): print("type:", self.type) print("Founded:", self.founded) () out.show() .lg ppool.display()
Language: PYTHON type: HIGH-LEVEL Founded: 1991
Здесь выше мы успешно создали вложенный класс . Теперь давайте пройдемся строчка за строчкой и поймем, что мы это сделали. Итак, сначала мы создали класс с именем language. Внутри него мы использовали ключевое слово self. Ключевое слово self-это ключ, через который мы можем получить доступ к атрибутам и методам aнашего созданного класса. Внутри класса language мы создали еще один вложенный класс под названием specification. Там мы точно так же определили спецификации. Наконец, мы получаем желаемый результат.
Mutable default values
Python stores default member variable values in class attributes.
Consider this example, not using Data Classes:
class C: x = [] def add(self, element): self.x += element o1 = C() o2 = C() o1.add(1) o2.add(2) assert o1.x == assert o1.x is o2.x
Note that the two instances of class C share the same class
variable x, as expected.
Using Data Classes, if this code was valid:
@dataclass class D: x: List = [] def add(self, element): self.x += element
it would generate code similar to:
class D: x = [] def __init__(self, x=x): self.x = x def add(self, element): self.x += element assert D().x is D().x
This has the same issue as the original example using class C.
That is, two instances of class D that do not specify a value for
x when creating a class instance will share the same copy of
x. Because Data Classes just use normal Python class creation
they also share this problem. There is no general way for Data
Classes to detect this condition. Instead, Data Classes will raise a
TypeError if it detects a default parameter of type list,
dict, or set. This is a partial solution, but it does protect
against many common errors. See in the Rejected Ideas section for more details.
Using default factory functions is a way to create new instances of
mutable types as default values for fields:
How to Check an Object’s Class
You can check an object’s class with the attribute. Generally, you’ll get the same result when using the function.
Here’s how to output the class of an object (using both syntaxes):
a = «Hello World»
print(type(a))
print(a.__class__)Result
<class 'str'> <class 'str'>
What that tells us is that the string is based on the class.
You can do the same thing for any object. Here are some more examples:
from myPackage.calculations import multiplyMe
print(type(10))
print(type(1.0))
print(type())
print(type((1,2,3)))
print(type({1,2,3}))
print(type({1:»Hello», 2:»World»}))
print(type(multiplyMe))
print(type(max))Result
<class 'int'> <class 'float'> <class 'list'> <class 'tuple'> <class 'set'> <class 'dict'> <class 'function'> <class 'builtin_function_or_method'>
- Python Modules
- Read/Write Files
Changes to raise
The statement has been extended to allow raising a class
exception without explicit instantiation. The following forms, called
the «compatibility forms» of the statement, are allowed:
- exception
- exception, argument
- exception, (argument, argument, …)
When exception is a class, these are equivalent to the
following forms:
- exception()
- exception(argument)
- exception(argument, argument, …)
Note that these are all examples of the form
raise instance
which in itself is a shorthand for
raise class, instance
where class is the class to which instance belongs.
In Python 1.4, only the forms
- class, instance and
- instance
were allowed;
in Python 1.5 (starting with 1.5a1) the forms
- class and
- class, argument(s)
were added. The allowable forms for string exceptions are unchanged.
For various reasons, passing None as the second argument to
raise is equivalent to omitting it. In particular, the
statement
raise class, None
is equivalent to
raise class()
and not to
raise class(None)
Likewise, the statement
raise class, value
where
value happens to be a tuple is equivalent to passing the
tuple’s items as individual arguments to the class constructor, rather
than passing value as a single argument (and an empty tuple
calls the constructor without arguments). This makes a difference
because there’s a difference between and
.
These are all compromises — they work well with the kind of
arguments that the standard exceptions typically take (like a simple
string). For clarity in new code, the form
raise class(argument, …)
is recommended (i.e. make an explicit call to the constructor).
How Does This Help?
The motivation for introducing the compatibility forms was to allow
backward compatibility with old code that raised a standard exception.
For example, a __getattr__ hook might invoke the statement
raise AttributeError, attrname
when the desired attribute is not defined.
Using the new class exceptions, the proper exception to raise would
be (attrname); the compatibility
forms ensure that the old code doesn’t break. (In fact, new code that
wants to be compatible with the -X option must use the
compatibility forms, but this is highly discouraged.)
Переопределение метода
Обратите внимание, что в приведенном выше примере метод __init __() был определен в обоих классах, Triangle и Polygon. Когда это происходит, метод производного класса переопределяет метод базового класса
Это означает, что __init __() в Triangle получает предпочтение перед __init__ в Polygon.
Обычно при переопределении базового метода мы стремимся расширить определение, а не просто заменить его. То же самое делается путем вызова метода в базовом классе из метода в производном классе (вызов Polygon .__ init __() из __init __() в Triangle).
Лучшим вариантом было бы использовать встроенную функцию super(). Итак, super() .__ init __ (3) эквивалентен Polygon .__ init __ (self, 3) и является предпочтительным. Чтобы узнать больше о функции super() в Python, посетите функцию Python super().
Две встроенные функции isinstance() и issubclass() используются для проверки наследования.
Функция isinstance() возвращает True, если объект является экземпляром класса или других классов, производных от него. Каждый класс в Python наследуется от объекта базового класса.
>>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True
Точно так же issubclass() используется для проверки наследования классов.
>>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True
Было полезно224
Нет28
8781cookie-checkНаследование в Python
Descriptive: Naming Styles
There are a lot of different naming styles. It helps to be able to
recognize what naming style is being used, independently from what
they are used for.
The following naming styles are commonly distinguished:
-
b (single lowercase letter)
-
B (single uppercase letter)
-
lowercase
-
lower_case_with_underscores
-
UPPERCASE
-
UPPER_CASE_WITH_UNDERSCORES
-
CapitalizedWords (or CapWords, or CamelCase — so named because
of the bumpy look of its letters ). This is also sometimes known
as StudlyCaps.Note: When using acronyms in CapWords, capitalize all the
letters of the acronym. Thus HTTPServerError is better than
HttpServerError. -
mixedCase (differs from CapitalizedWords by initial lowercase
character!) -
Capitalized_Words_With_Underscores (ugly!)
There’s also the style of using a short unique prefix to group related
names together. This is not used much in Python, but it is mentioned
for completeness. For example, the os.stat() function returns a
tuple whose items traditionally have names like st_mode,
st_size, st_mtime and so on. (This is done to emphasize the
correspondence with the fields of the POSIX system call struct, which
helps programmers familiar with that.)
The X11 library uses a leading X for all its public functions. In
Python, this style is generally deemed unnecessary because attribute
and method names are prefixed with an object, and function names are
prefixed with a module name.
In addition, the following special forms using leading or trailing
underscores are recognized (these can generally be combined with any
case convention):
Готовимся к моделированию
Теперь, когда мы знакомы с данными, пришло время подготовить их к моделированию. Как упоминалось ранее, объекты имеют буквы, представляющие различные возможные значения, но нам нужно превратить их в числа.
Для этого мы будем использоватькодирование этикеткиа такжегорячая кодировка
Давайте сначала используем кодирование метки в целевом столбце. Запустите следующий код:
И вы заметили, что теперь столбец содержит 1 и 0.
Результат метки, кодирующей столбец «класс»
Теперь ядовитый представлен 1, а съедобный — 0. Теперь мы можем думать о нашем классификаторе как «ядовитый или нет». Ядовитый гриб получает 1 (true), а съедобный гриб — 0 (false).
Следовательно,кодирование этикеткипревратит категорический признак в числовой. Однако не рекомендуется использовать кодирование меток, когда существует более двух возможных значений.
Зачем?
Потому что тогда он будет присваивать каждое значение либо 0, 1 или 2 Это проблема, потому что «2» можно рассматривать какболее важныйи из этого можно извлечь ложные корреляции.
Чтобы избежать этой проблемы, мы используемгорячее кодированиена других особенностях. Чтобы понять, что он делает, давайте рассмотрим форму крышки первой точки входа. Вы видите, что оно имеет значение «х», которое обозначает выпуклую форму колпачка. Однако в наборе данных записано всего шесть разных форм колпачков. Если мы одноразово закодируем функцию, мы должны получить:
Горячее кодирование функции «шапка-форма»
Как видите, форма шапки теперь является векторной. 1 обозначает фактическое значение формы шапки для записи в наборе данных, а остальное заполнено 0. Опять же, вы можете думать о 1 какправдаи 0 какложный.
Недостаток однократного кодирования состоит в том, что он вводит больше столбцов в набор данных. В случае формы колпачка мы переходим от одного столбца к шести столбцам. Для очень больших наборов данных это может быть проблемой, но в нашем случае дополнительные столбцы должны быть управляемыми.
Давайте продолжим и быстро закодируем остальные функции:
И теперь вы должны увидеть:
Набор горячих закодированных данных
Вы заметили, что мы поднялись с 23 столбцов до 118. Это пятикратное увеличение, но их недостаточно, чтобы вызвать проблемы с памятью компьютера.
Теперь, когда наш набор данных содержит только числовые данные, мы готовы начать моделирование и делать прогнозы!