高校化学2924392 views
りんご209490 views
中学理科1630641 views
中学英語811710 views
雑学1473612 views
いろは3010814 views
世界の国564520 views
ヒストリア290598 views
高校生物551766 views
高校倫理1440106 views
Help
Tools
NewsSpreadsheetCalendarBookkeepingMarkdown TablesSlidesTier ListPen ToolIllustrationCrayonWatercolorPixel ArtASCII ArtPerspectiveEndless StairsGraphMind MapER DiagramFamily TreeMemeCurved TextImage EditorMosaicRetro FilterPencil SketchSwirl EffectLine ArtOCR/HighlighterMakeup EditorFaviconVideo TrimmerScrolling VideoVideo TitleColor PickerColor ExtractorBonfireFireworksWater RippleWater SplashBreaking GlassWood GrainMarble TextureCSS ButtonIcon MakerBar ChartGrouped Bar ChartStacked Bar ChartPie ChartLine ChartArea ChartStacked Area ChartScatter Plot3D Bar Chart3D Pie ChartBar Chart RaceBubble ChartPopulation PyramidPictogramEarningsCandlestick ChartInvestment RiskMortgage SimulatorCalculatorMatrix CalculatorFunction GraphPolynomial ExpansionVenn DiagramField VisualizerRubik's Cube Group TheoryTraveling SalesmanVoronoi and DelaunayFractalColumn ArithmeticDraw Math FiguresArithmetic AnimationArithmetic Word ProblemsCounting with Tree DiagramsCube NetsRolling DiceCross SectionsMotion PathMechanicsWavesElectromagnetic WavesCapacitorsLight and LensesThermodynamicsHow Semiconductors WorkMolecular StructuresAtomic OrbitalsElectrochemical CellsChemical EquilibriumCrystal LatticesBuffer pHOrganic Reaction MapPeriodic TableComplex IonsDNA Double HelixCell DivisionMembrane ChannelsNerve ImpulseMuscle ContractionHormones and HomeostasisRock ClassificationWeatherConstellationsSolar and Lunar Eclipses3D ModelingFloor PlanSeismic StructuresIntersection TurnMaglevCooking AnimationOrigamiLive Viewer CountGeoJSON MapRailway MapPopulation MapCrime MapLand Price MapSchool MapShrine and Castle MapHouse of Representatives MapWord MapSolitaireReversiHakoiri MusumeChessHamburgerRippleSlide Puzzle MakerNeon PinballNovel MakerJapanese Typing PracticePiano Score EditorMusic TheoryShogi StrategyPiano Rhythm Game

English

Python の Protocol によるダックタイピングの型付け

Protocol を使うと、ダックタイピングに型ヒントを付けられます。特定のメソッドやプロパティを持つオブジェクトを受け入れる関数を、型安全に定義できます。

基本的な使い方

Protocol クラスを継承して、必要なメソッドを定義します。

from typing import Protocol

class Speakable(Protocol):
    def speak(self) -> str: ...

def make_speak(obj: Speakable) -> None:
    print(obj.speak())

Protocol を明示的に継承していなくても、speak メソッドを持っていれば型チェックを通過します。

class Dog:
    def speak(self) -> str:
        return "Woof!"

class Cat:
    def speak(self) -> str:
        return "Meow!"

make_speak(Dog())  # OK
make_speak(Cat())  # OK

複数のメソッドを要求

Protocol に複数のメソッドを定義できます。

from typing import Protocol

class Serializable(Protocol):
    def to_json(self) -> str: ...
    def from_json(self, data: str) -> None: ...

プロパティの定義

プロパティも Protocol で定義できます。

from typing import Protocol

class Named(Protocol):
    @property
    def name(self) -> str: ...

def greet(obj: Named) -> None:
    print(f"Hello, {obj.name}!")

抽象基底クラスとの違い

Protocol

継承不要。メソッドの存在だけで適合判定。構造的部分型(structural subtyping)。

ABC(抽象基底クラス)

明示的な継承が必要。名前的部分型(nominal subtyping)。

Protocol は既存のクラスを変更せずに型制約を追加できるため、サードパーティのライブラリとの連携や、柔軟な設計に向いています。