# 面向過程Procedure-oriented的編程方式 就是通過函數(shù)組織起數(shù)據(jù)
# 面向?qū)ο?則是將數(shù)據(jù)與功能進(jìn)行組合 將其分裝在"對象"中
# 類 Class 可以產(chǎn)生一種Type
# 對象 Object 是類的實例Instance
# 在Python里整數(shù)也是一個對象,它是int類的對象
# 但是在C Java里整數(shù)是原始內(nèi)置類型
# 字段Field是 對象里用來存儲數(shù)據(jù)的變量 一種是對象(實例)變量 一種是類變量
# 方法Method是 對象里實現(xiàn)某些功能的函數(shù)
# 字段和方法統(tǒng)稱為 類的屬性
# 在Python里 Field + Method = Class
# 類通過class關(guān)鍵字定義
class Person:
pass # 通過pass可以創(chuàng)建一個空代碼塊
p = Person()
print(p)
oop_methond.py
# 類的方法與普通函數(shù)不一樣的地方在于 它的參數(shù)列表必須帶有一個self(參數(shù)名字叫self是約定俗成的)參數(shù),而且必須是開頭
# 不需要為self賦值
# example: Myclass 類下面有一個實例 myobject
# 你去調(diào)用它的方法 myobject.method(arg1,arg2)
# Python會把它自動轉(zhuǎn)成Myclass().(myobject,arg1,arg2)
# 所以即使你沒有其他的參數(shù),self參數(shù)也是必須的。self參數(shù)相當(dāng)于Java的this指針
class Person:
# @classmethod
# 在加了上面那句裝飾器以后就可以通過Person.say_hi()直接調(diào)用了
# 否則就要用Person().say_hi()來調(diào)用
def say_hi(self):
print('Hello, how are you?')
p = Person()
p.say_hi()
# 上面兩句也等價于 Person().say_hi()
Person().say_hi()
oop_init.py
# Python中有很多方法的名稱具有特殊意義
# __init__方法在類的對象被實例化Instantiated時運行(類似Java構(gòu)造函數(shù))
# __init__方法用來初始化操作
class Person:
def __init__(self,name):
self.name = name
def say_hi(self):
print('Hello, my name is {0}'.format(self.name))
p = Person('takkum')
p.say_hi()
oop_objvar.py
# 字段是綁定到Bound類或者對象的命名空間Namesoace的變量
# 這些變量僅在類與對象所存在的上下文中有效 這就是他們被稱作命名空間的原因
# 類變量是共享的 他們可以被屬于該類的所有實例訪問 它只有一個副本
# 對象變量由類的每一個獨立的實例所擁有 它有屬于自己的副本
class Robot:
'''表示有一個帶有名字的機器人。'''
# 一個類變量,用來計數(shù)機器人數(shù)量
population = 0
def __init__(self,name):
'''初始化數(shù)據(jù)'''
self.name = name
print('(Initializing {})'.format(self.name))
# 當(dāng)有機器人被創(chuàng)建時,機器人
# 將會增加人口數(shù)量
Robot.population += 1
def die(self):
'''我掛了。'''
print("{} is being destroyed!".format(self.name))
Robot.population -= 1
if Robot.population == 0:
print("{} was the last one.".format(self.name))
else:
print("There are still {:d} robots working.".format(Robot.population))
def say_hi(self):
'''來自機器人的誠摯問候
沒問題,你做得到。'''
print('Greetings, my masters call me {}.'.format(self.name))
# 裝飾器
@classmethod
def how_many(cls):
'''打印出當(dāng)前人口數(shù)量'''
print("We have {:d} robots.".format(cls.population))
droid1 = Robot("R2-D2")
droid1.say_hi()
Robot.how_many()
droid2 = Robot("C-3P0")
droid2.say_hi()
Robot.how_many()
print("Robots have finished their work. So let's destroy them.")
droid1.die()
droid2.die()
Robot.how_many()
# 等價于 self.__class__.how_many()
# 在數(shù)據(jù)成員前面用雙下劃線作為前綴 __privatevar
# Python會使用名稱調(diào)整Name-mangling 使其成為一個私有變量
# 訪問類的文檔說明
# Robot.__doc__
# 訪問類的方法的文檔說明
# Robot.say_hi.__doc__
print(Robot.__doc__)
print(Robot.__init__.__doc__)
print(Robot.how_many.__doc__)
oop_subclass.py
# 繼承
# 基類 Base Class 或者超類 Superclass
# 派生類 Derived Class 或者子類 Subclass
class SchoolMember:
'''代表任何學(xué)校里的成員。'''
def __init__(self,name,age):
self.name = name
self.age = age
print('(Initialized SchoolMember: {})'.format(self.name))
def tell(self):
'''告訴我有關(guān)的細(xì)節(jié)。'''
print('Name:"{}" Age:"{}"'.format(self.name,self.age),end=" ")
class Teacher(SchoolMember):
'''代表一位老師。'''
def __init__(self,name,age,salary):
SchoolMember.__init__(self,name,age)
self.salary = salary
print('(Initialized Teacher: {})'.format(self.name))
def tell(self):
SchoolMember.tell(self)
# {;d} 代表輸出的是整數(shù) C語言里面就是%d
print('Salary: "{:d}"'.format(self.salary))
class Student(SchoolMember):
'''代表一位學(xué)生。'''
def __init__(self,name,age,marks):
SchoolMember.__init__(self,name,age)
self.marks = marks
print('(Initialized Student:{})'.format(self.name))
def tell(self):
SchoolMember.tell(self)
print('Marks: "{:d}"'.format(self.marks))
t = Teacher('Mrs.Wang',40,30000)
s = Student('Swaroop',25,95)
# 打印一行空白
print()
members = [t,s]
for member in members:
# 對師生
member.tell()