【Pythonプログラミング】Mixinクラスについて解説!〜中級者向け〜

Поділитися
Вставка
  • Опубліковано 14 жов 2024

КОМЕНТАРІ • 33

  • @かぴ-c1u
    @かぴ-c1u 11 місяців тому

    MIXINを調べていてこの動画を見つけました。クラス変数の扱いがよく分からず困っていたのですが、この動画のサンプルで理解できました。ありがとう!

  • @Uni-Hoya
    @Uni-Hoya 2 роки тому +2

    ある言語1つでプログラミングを勉強していると、「この言語でサポートされているものがプログラミングの全てだ」と思ってしがいがちなので、こうした「ある設計テクニックを言語機能を駆使して実現する」という開発者体験があるとプログラミングの世界の奥深さを再認識できていいなって思います。

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому

      コメントありがとうございます!
      おっしゃる通り、Pythonは言語仕様でMixinをサポートしているわけじゃないですが、設計に気をつければMixinを実現できる言語ですね😊 色々なやり方を知るとプログラミングって奥深いなーって思いますよね✨

  • @ipg4140
    @ipg4140 2 роки тому

    お勧めして頂き、ありがとうございます。
    どの動画も分かりやすく、知識が増えていく実感ができます。
    動画作成大変かと思いますが、このような練習問題を希望したいです。

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому

      ご視聴いただきありがとうございます!
      クラス関連の練習問題も検討してみますね!

  • @blackbird694
    @blackbird694 2 роки тому

    いつも解りやすい解説ありがとうございます❗️

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому +1

      ご視聴いただきありがとうございます😊
      分かりやすさにこだわって動画を作っているので、そう言ってもらえて嬉しいです!!

  • @je-nos6977
    @je-nos6977 2 роки тому +1

    いつも楽しく視聴させて頂いています!
    2点質問させてください!(ずれていたこと聞いていたらすみません)
    ①複数のクラスで共通する機能を実装する場合、Mixinによる継承 or 委譲(合成)のどちらを使うか、判断基準は何でしょうか?
    自分ははじめ以下のイメージなのかなぁと思いながら聞いてましたが、請求書クラスと注文書クラスは(おそらく)異なる型だなと思い悩みました...
    - Aクラス、Bクラスが同じ型であり共通した機能が欲しい場合はMixin
    - Aクラス、Bクラスが異なる型であり共通した機能が欲しい場合は委譲(合成)
    ②疎結合のためよくabcを使うのですが、Mixinを使う場合どう併用するのがベストプラクティスなのでしょうか?
    多重継承を使うのかなと思ったのですが、多重継承は使いたくないなぁと...
    (もっと言えばMixinみたいな実装を含む継承の利用もなるべく避けたいのが本音... 継承はなるべくインターフェースとしてだけを目的として利用したい)

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому +1

      ご質問ありがとうございます!
      ① mixinはクラスの機能を拡張するものですが、委譲は拡張するものではなくオブジェクトを持っているだけです。委譲によって結果的に拡張することもありますが、機能拡張が目的ではありません。また、mixinと委譲は対立する考えではなく、両方を1つのクラスで使っても全く問題はありません。なので、機能拡張が目的ならmixin、オブジェクトの保持が目的なら委譲、っていうことですね。ちなみに、mixinは異なる型でも使って大丈夫です!むしろ、違う型でも同じ機能を差し込めるのがmixinの特徴であり、便利なところです!
      ② 継承はなるべくインターフェースとしてだけを目的として利用したい、という設計でしたら無理してmixinを使わなくても良いのではないかな?と思いました。インターフェースとしてのabcがあるクラスに対して、普通にmixinを多重継承して使うことに違和感があるということですかね?mixinは状態を持たないことを前提としているので、mixinは多重継承を使いたい時に、安全に使う方法となります。

    • @je-nos6977
      @je-nos6977 2 роки тому

      @@pythonvtuber9917
      なるほど!そもそも目的が異なるのですね。
      どうも継承についてアレルギーというか今までの経験則で、継承を使うときは機能の継承を目的とするのではなく、型を継承する目的で使う、が頭にあり迷ってしまいました。
      > むしろ、違う型でも同じ機能を差し込めるのがmixinの特徴であり、便利なところ
      > mixinは状態を持たないことを前提としている
      この2つが肝であると頭にいれたいとおもいます!
      丁寧な回答をありがとうございました!

  • @らいすふぃ
    @らいすふぃ 2 роки тому

    とても分かりやすかったです!ありがとうございます!

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому

      ご視聴いただきありがとうございます☺️
      Mixinは説明や実例をどうするか、かなり悩みましたがそう言ってもらえて、頑張って作って良かったです!!

  • @sattoman
    @sattoman 2 роки тому +1

    self経由でアクセスしてるtitleが呼び出し元によって変わるのは分かるんですが、派生クラスで定義したクラス変数を親クラスのメソッド内でアクセスできちゃうの混乱しますね(C++脳)

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому +1

      その気持ちわかります!!
      継承したメソッドは、すでに派生クラス側が持っているメソッドなんだと考えたら、うーん、まぁ、そうなのかな...🤔 って感じもしますが、ちょっと変な感じがしますよね!

  • @mccova625
    @mccova625 2 роки тому

    以前見たhas-aのときにどうやって実装すんだろ?って思っていたのでスッキリしました。設計思想に触れてくれるのは助かります。

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому +1

      ご視聴いただきありがとうございます😊
      クラスは色々な設計の仕方があるのですが、一気に動画にすると混乱しちゃうと思って少しずつ動画をUPしています!今後も設計関連をちょっとずつ出していくつもりなので、楽しみにしていてください😉

    • @mccova625
      @mccova625 2 роки тому

      @@pythonvtuber9917 楽しみにしています!

  • @jpmikewired
    @jpmikewired 2 роки тому

    大変参考になりました。

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому

      ご視聴いただきありがとうございます😊

  • @tsubasa_km
    @tsubasa_km 2 роки тому +1

    インスタンスするかしないかの違いってことですかね?継承辺りは使いこなせる気がしない😇

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому +1

      インスタンスするか・しないかより、機能を混ぜ込むという概念を実装するためのものですね😉
      動画の冒頭でもお話ししている通り、クラス・継承があやふやな場合は、飛ばしてもらっても大丈夫です!

  • @me-me-661
    @me-me-661 2 роки тому

    今回もわかりやすかったです。ありがとうございます。使いとごろはやっぱり'表示する'系が多いのですかね?ちょっと違うけど似たようなグラフ描画のメソッドをたくさん作ってしまった時に、整理してまとめるのに使えそうだなと思いました。

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому +1

      ご質問ありがとうございます!
      今回は、たまたま表示する機能をMixinで機能追加しましたが、決してそれが多いというわけじゃないです!例えばDjango(PythonのWebフレームワーク)では、「LoginRequiredMixin」(Viewにログイン権限をかけることができるMixin)や「UserPassesTestMixin」(カスタム可能な権限を付与できるMixin)といった、権限周りのmixinなどもあります😉
      参考 ▶︎ just-python.com/document/django/views-basic/views-mixin
      グラフ描画もmixinとして使えそうですね!ぜひ機会があれば使ってみてください😊

  • @konoyonoblue
    @konoyonoblue 2 місяці тому

    中級者になりたい!!

  • @ren-x4n
    @ren-x4n 2 роки тому

    クラス設計についての動画ありがとうございます。勉強になりました。
    個人的にはhas-a(コンポジション)の関係に近いのかなと思いました。両者でメリットやデメリットはあるのでしょうか🤔

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому +1

      ご質問ありがとうございます😊
      has-aはオブジェクトを持っているだけなので、そのクラス自体が拡張されるわけじゃないですが、mixinはそのクラス自体が拡張されるイメージかなって思います!mixinで機能拡張したクラスでも、もちろんhas-aは使えるので、2つは対立する考え方ではないですね😉 この辺のクラスの設計の選択や、メリット・デメリットについてはコメントだけでは説明しきれないので、いつか動画を出そうと思います!

  • @ms-fl6hs
    @ms-fl6hs 2 роки тому

    クラス変数へのアクセスはself.titleでいいのでしょうか?cls.titleじゃだめなのでしょうか?

    • @pythonvtuber9917
      @pythonvtuber9917  2 роки тому +1

      ご質問ありがとうございます😊
      クラス変数へのアクセスは、オブジェクト側から(main関数から)は[クラス名].titleでアクセスして、クラスのメソッド内ではself.titleでアクセスするのが一般的ですね😉
      メソッドの中でも[クラス名].titleでもアクセスはできるのですが、Pythonの公式サイトを見てもself.を使っているので、メソッド内ではselfを使った方が良いかと思います!
      参考(二つ目のコードのtricks) ▶︎ docs.python.org/ja/3/tutorial/classes.html#class-and-instance-variables

  • @西田博-x4w
    @西田博-x4w 2 роки тому +1

    😀😀😀

  • @agokuroneko7280
    @agokuroneko7280 2 роки тому

    No idea what am I doing here