python學習-基礎-面向物件程式設計
阿新 • • 發佈:2019-01-14
面向物件程式設計
1.# 類是抽象的模板
class Student(object): #object表示從哪個類繼承的,沒有繼承類就使用object """docstring for Student""" # 初始化必需屬性,第一個引數永遠是self # 有了__init__方法,在建立例項的時候,就不能傳入空的引數了 def __init__(self, name, score): super(Student, self).__init__() # 例項變數前加__ 就是private變數,只能內部訪問, 約定加_ 也為私有變數, 但實際外部可以訪問,一切靠自覺 # #不能直接訪問__name是因為Python直譯器對外把__name變數改成了_Student__name, # 所以,仍然可以通過_Student__name來訪問__name變數,但是不同版本的Python直譯器可能會把__name改成不同的變數名 self.__name = name self.__score = score self.__sp__ = '123' # 例項變數前後都加__ 為特殊變數,外部可以訪問 # 第一個引數是self def print_score(self): print('%s: %s' % (self.__name, self.__score)) def get_grade (self): if self.score >= 90: return 'A' elif self.score >= 60: return 'B' else: return 'C' # 訪問內部屬性 def get_name(self): return self.__name # 修改內部屬性 def set_name (self, name): if not isinstance(name, str): ErrorType('type error', name) return self.__name = name bart = Student('Bart Simpson', 59) lisa = Student('Lisa Simpson', 87) bart.print_score() lisa.print_score() print(bart.get_name()) bart.set_name('Jone') print(bart.get_name())
2.# 繼承
class Animal(object): """docstring for Animal""" def __init__(self, ): super(Animal, self).__init__() # self.arg = arg def run (self): print('run run run ....') class Cats(Animal): """docstring for Cats""" def run(self): print('Cat is running...') class Dogs(Animal): """docstring for Dogs""" def __init__(self): super(Dogs, self).__init__() self.__name__ = 'dog' self.age = 10 def eat (self): print(self.__name__ + ' eating meat...') dog = Dogs() dog.eat()
3.# 判斷物件型別,有哪些方法 type()
# 判斷物件型別,有哪些方法 type() print(type(123)) # int type(123)==int # True type('abc')==str # True type('abc')==type(123) # False # 判斷具體型別可以用 str int 但如果要判斷一個物件是否是函式怎麼辦?可以使用types模組中定義的常量: import types print(type(abs) == types.BuiltinFunctionType) # isinstance() 總是優先使用isinstance()判斷型別,可以將指定型別及其子類“一網打盡”。 # isinstance判斷繼承關係 print(isinstance(dog, Dogs)) print(isinstance(dog, Animal)) print(isinstance(dog, Dogs) and isinstance(dog, Animal)) # isinstance 判斷型別 isinstance('a', str) isinstance(123, int) isinstance(b'a', bytes) # isinstance 判斷一個變數是否是某些型別中的一種 isinstance([1, 2, 3], (list, tuple)) isinstance((1, 2, 3), (list, tuple)) # dir() 獲得一個物件的所有屬性和方法,可以使用dir()函式 返回一個包含字串的list # print(dir('AB')) # ['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill'] # # 配合getattr()、setattr()以及hasattr(),我們可以直接操作一個物件的狀態: # 只有在不知道物件資訊的時候,我們才會去獲取物件資訊 print(hasattr(dog, '__name__')) # 判斷物件屬性是否存在 print(hasattr(dog, 'age')) setattr(dog, 'y', 19) # 設定新屬性 print(hasattr(dog, 'y')) # True print(getattr(dog, 'y', 404)) # 19 如果不存在,會報錯,可以新增第三個引數,返回預設值 print(hasattr(dog, 'run')) # 判斷物件方法是否存在 # 正確用法 首先要判斷該fp物件是否存在read方法,如果存在,則該物件是一個流,如果不存在,則無法讀取 def readImage(fp): if hasattr(fp, 'read'): return readData(fp) return None
- #例項屬性和類屬性
# 在編寫程式的時候,千萬不要對例項屬性和類屬性使用相同的名字
# ,因為相同名稱的例項屬性將遮蔽掉類屬性,但是當你刪除例項屬性後,再使用相同的名稱,訪問到的將是類屬性
class Student1(object):
name = 'Student' # 這種屬性為類屬性,類的所有例項都可以訪問,相當於public
count = 0
def __init__(self, age):
self.name = age
Student.count += 1 # 每例項化一次,次數增加1次