1.class and instance
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('{}: {}'.format(self.name, self.score))
john = Student('John', 87)
john.print_score()
class Student:
pass
s = Student()
s.name = 'John'
2.存取限制
john= Student('John', 87)
john.score
>>> 87
john.score = 10
john.score
>>> 10
class Student:
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print('{}: {}'.format(self.name, self.score))
john= Student('John', 87)
john.score
>>> AttributeError.....
class Student:
def __init__(self, name, score):
self.__name = name
self.__score = score
def print_score(self):
print('{}: {}'.format(self.name, self.score))
def get_score(self):
return self.__score
def set_score(self, score):
self.__score = score
def set_score(self, score):
if 0 <= score <= 100:
self.__score = score
else:
raise ValueError('invalid score')
3.繼承
class Animal(object):
def run(self):
print('Animal is running')
class Dog(Animal):
pass
class Cat(Animal):
pass
dog = Dog()
dog.run()
==> Animal is running
class Dog(Animal):
def run(self):
print('Dog is running')
class Cat(Animal):
def run(self):
print('Cat is running')
4.多型
a = Animal()
d = Dog()
>>>isinstance(a, Animal)
True
>>>isinstance(d, Dog)
True
>>>isinstnace(d, Animal)
True
>>>isinstnace(a, Dog)
False
5.獲得物件的資訊
type(123)
==> <class 'int'>
type('str')
==> <class 'str'>
type(None)
==> <type(None) 'NoneType'>
type(123)==int
==> True
# 若要比較是哪一種函數
import types
def fn():
pass
type(fn)==types.FunctionType
==> True
type(abs)==types.BuiltinFunctionType
==> True
type(lambda x: x)==types.LambdaType
==> True
type((x for x in range(10)))==types.GeneratorType
==> True
# 可以查看該物件的所有屬性、方法
dir('test')
==> ['__add__',...]
# 類似__xxx__的屬性或方法是有特殊用意的,像__len__方法等於使用len()方法,會回傳物件長度
len('test')
==> 4
'test'.__len__()
==> 4
# 可透過這三個方法getattr()、setattr()以及hasattr()來操作物件的屬性和方法
class MyObject:
def __init__(self):
self.x = 9
obj = MyObject()
hasattr(obj, 'x') # 判斷是否有x屬性
==> True
setattr(obj, 'y', 19) # 增加一個屬性y
hasattr(obj, 'y')
==> True
getattr(obj, 'y') # 取得屬性y,沒有這個屬性會報Attribute Error
==> 19
getattr(obj, 'z', 404) # 如果取不到該屬性,可以給一個預設值
sum = obj.x + obj.y # 能用這種方法取值就不要用下面的方法!!!
sum = getattr(obj, 'x') + getattr(obj, 'y')
# 只有不確定該物件是否有該屬性時才會使用,類似下面的用法
def getData(func):
if hasattr(func, 'read'):
return 'good'
return None
6.實例屬性和類別屬性
class Student:
def __init__(self, name):
self.name = name
s = Student('a')
s.score = 90
class Student:
name = 'Student'
s = Student()
print(s.name)
==> Student
print(Student.name)
==> Student
class Student(object):
count = 0
def __init__(self, name):
self.name = name
self.count += 1
class Student(object):
count = 0
def __init__(self, name):
self.name = name
Student.count += 1
class Student(object):
count = []
def __init__(self, name):
self.name = name
self.count.append(1)