[note] Python OOP
常用方法
Global Methods
type(obj) # 取得建立該 instance 的 Class
isinstance(obj, Class)
# 如果屬性是會動態改變的
getattr(obj, name, [default_value]) # 拿不到該屬性時不會噴 error
setattr(obj, name, value)
Class
__init__
class Dog:
# Class Attribute
species = "Canis lupus familiaris"
def __init__(self, name, breed, age):
# Instance Attributes
self.name = name
self.breed = breed
self.age = age
# Instance Method
def bark(self):
return f"{self.name} is barking!"
存取 class attribute 的方式:
Dog.species
Instance
__dict__
buddy = Dog("Buddy", "Golden Retriever", 5)
bella = Dog("Bella", "Labrador", 3)
buddy.__dict__ # {'name': 'Buddy', 'breed': 'Golden Retriever', 'age': 5}
讀取 object attribute 的邏輯
在 Python 中,查找 object attribute 的邏輯如下,如果該 object 本身就有該屬性,則會直接拿該屬性的值,例如 buddy.name
;如果該 object 本身沒有該屬性,則會看看它的 class 中有沒有該屬性,例如 buddy.species
會拿到的是 class attribute 的值(即,Dog.species
);如果 instance attribute 和 class attribute 都找不到,而且也不是用 getattr
有預設值的話,則會噴 AttributeError
的錯誤。
要注意的是,這樣的邏輯只能使用在讀取 object attribute 的情況,如果是要設定 object attribute 的話,則不適用上述這樣的邏輯。
Instance Methods
基本觀念
class MyClass:
pass
MyClass.__name__ # 'MyClass'
my_obj = MyClass()
type(my_obj) # MyClass
isinstance(my_obj, MyClass) # True
- 在 Python 中
class
也被稱作type
- class 的
type
也是type
(type(MyClass) == type(type) == type
)
- class 的