0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python 初級入門 オブジェクトとクラス編

Posted at
  • python初学者、触ったことない人が投稿しています
  • 個人的にあまり馴染みのない書き方について記載しています
  • 誤っている箇所等があればコメントでご指摘いただけると幸いです
  • こちらの記事はパッケージとモジュール編の続きとなっていますので気になる方は是非!

では早速本編へ

クラス

クラスの初期化、定義、デストラクタ

  • classの定義
    • Person # python3から
    • Person()
    • Person(object)
  • クラスの初期化__init__が呼ばれる(コンストラクタみたいな??)
  • クラスが呼ばれん空くなったタイミングでデストラクタ__del__が呼ばれる
.py
class Person:
    def __init__(self,name):
        self.name = name
        
    def greeting(self):
        print(f'I am {self.name}. hello')

    def __del__(self):
        print('bye')

person = Person('Mike')
person.greeting() # I am Mike. hello

del person # 明示的にdelをコール

クラスの継承

  • クラス定義で継承するクラスを渡す
    • ()に親クラスを渡す
  • メソッドのオーバーライド
    • super()で親の関数を呼び出して、特定のクラスでのみ使用する処理を追加できる
  • プロパティを使って属性の設定
    • _にはプライベートな意味合いがある
    • __はクラス内からの参照しか許容しない
    • @propertyを設定したもの
      • 呼び出す際に()は不要
      • 外から呼び出した際に値を代入することは不可
      • 書き換え可能にする場合はsetterを設定する
      • 基本的に何か条件を加えて、setterを動くようにするのがメジャー
.py
class Car(object):
    def __init__(self,model= None):
        self.model = model
        
    def run(self):
        print('run')

class ToyotaCar(Car): # クラスの継承
    pass

class AutoCar(Car)
    def __init__(self,model= 'hoge',is_run=False):
        super().__init__(model) # オーバーライド
        self.isRun = is_run

    #ここ単体だと値の設定は不可
    @property 
    def is_run(self):
        return self.is_run 

    # 値を設定する際は以下も必要
    @is_run.setter
    def is_run(self,is_run):
        if seld.model == 'crown'
            self.is_run = is_run

    def auto
        print('auto')

toyota = ToyotaCar('crown')
print(toyota.model) # crown
toyota.run() # run

autoCar = AutoCar('auto-fast')
print(autoCar.model) # auto-fast
autoCar.run() # run
autoCar.auto() # auto

抽象クラス

  • 抽象クラスのメソッドを必ず実装してほしいメソッドを@abc.abstractmethodで使用できる
  • 作る必要がなければ作らない方がいいかも
    • 元々なかったからあまり推奨されていない?
.py
import abc

class Person(metaclass = abc.ABCMeta): # 抽象クラス
    def __init__(self, age = 1):
        self.age = age

    @abc.abstractmethod
    def say_hello(self):
        pass

class Adult(Person):
    def __init__(self, age = 20):
        if (self.age >= 20):
            super().__init__(age)
        else:
            raise Exception

adult = Adult()

多重継承クラス

  • 複数継承してクラスを定義
    • Robot(Person,Car)みたいな場合はPersonに定義されているものから優先的に使われる
    • メソッド名とかが被った場合は左のclassから評価される
  • 最初からわかっているなら使うべきではない
.py
class Person(object):
    def __init__(self, name = 'taro'):
        self.kind = 'human'
        self.name = name

    def who_are_you:
        print(self.name, self.kind)

a = Person(a)
a.who_are_you() # a, human

クラスメソッドとスタティックメソッド

  • クラスメソッドはインスタンス化していなくてもアクセスが可能
.py
class Person():
    age = 20
    def __init__(self):
        self.a = 100

    @classmethod
    def how_old(cls):
        return cls.age

    @staticmethod
    def about(year):
        print(f'about human {year}')

a = Person() # object
b = Person 

print(a.a) # 100
print(b.a) # error

# オブジェクトになっていなくてもアクセスできる
print(a.how_old) # 20
print(b.how_old) # 20

print(a.age) #20
print(b.age) #20

Person.about(1000) # about human 1000

特殊メソッド

  • __が特殊メソッドに該当する
  • 一覧
.py
class Hoge(object):
    def __init__(self,piyo):
        self.text = text

    def __str__(self):
        return 'foo'

h = Hoge('ppp')
print(h)

最後に

  • なんかpython3とかで新たに付け加えられても2の方が浸透してるからみたいな感じで新しいものが使われてない感じがする。これに関しては深く調べてないのでただの感想でしかないです
  • 便利な反面の副作用的なところを意識しないといけないことが多い気がする
  • 次回はファイル操作等について学んでみようと思います
  • 次の次は。。。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?