1. 程式人生 > >python學習-基礎-面向物件程式設計

python學習-基礎-面向物件程式設計

面向物件程式設計

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

  1. #例項屬性和類屬性

 # 在編寫程式的時候,千萬不要對例項屬性和類屬性使用相同的名字
 # ,因為相同名稱的例項屬性將遮蔽掉類屬性,但是當你刪除例項屬性後,再使用相同的名稱,訪問到的將是類屬性
class Student1(object):
    name = 'Student' # 這種屬性為類屬性,類的所有例項都可以訪問,相當於public
	count = 0
	def __init__(self, age):
        self.name = age
        Student.count += 1 # 每例項化一次,次數增加1次