9.2 定义类
class Car(object): #类体 pass
9.3 创建对象
class Car(object): #类体 pass car = Car()
9.4 类的成员
class Dog: def __init__(self,name,age): self.name = name #创建和初始化实例变量name self.age = age #创建和初始化实例变量age d = Dog("球球",2) print("我们家狗狗名叫{0},{1}岁了。".format(d.name,d.age))
9.4.1 实例变量
class Dog: def __init__(self,name,age): self.name = name #创建和初始化实例变量name self.age = age #创建和初始化实例变量age d = Dog("球球",2) print("我们家狗狗叫{0},{1}岁了".format(d.name,d.age))
9.4.2 构造方法
class Dog: def __init__(self,name,age,sex = "雄性"): #带有默认值的构造方法,能够给调用者提供多个不同版本的构造方法 self.name = name #创建和初始化实例变量name self.age = age #创建和初始化实例变量age self.sex = sex #创建和初始化实例变量sex d1 = Dog("球球",2) #创建对象调用,省略默认值 d2 = Dog("哈哈",1,"雄性") d3 = Dog(name = "拖布",sex = "雄性",age = 3) #使用关键字参数调用构造方法 print("{0}:{1}岁{2}。".format(d1.name,d1.age,d1.sex)) print("{0}:{1}岁{2}。".format(d2.name,d2.age,d2.sex)) print("{0}:{1}岁{2}。".format(d3.name,d3.age,d3.sex))
9.4.3 实例方法
class Dog: #构造方法 def __init__(self,name,age,sex = "雄性"): #带有默认值的构造方法,能够给调用者提供多个不同版本的构造方法 self.name = name #创建和初始化实例变量name self.age = age #创建和初始化实例变量age self.sex = sex #创建和初始化实例变量sex #实例方法 def run(self): #定义实例方法,只有一个self参数 print("{}在跑...".format(self.name)) #实例方法 def speak(self,sound): #定义实例方法,第一个参数是self,第二个参数是sound print("{}在叫,{}!".format(self.name,sound)) dog = Dog("球球",2) #创建对象调用方法,省略默认值 dog.run() #在调用时采用"对象.实例方法"。不需要传递参数 dog.speak("旺旺旺") #需要传递一个参数sound
9.4.4 类变量
class Account: interest_rate = 0.0568 def __init__(self,owner,amount): self.owner = owner #创建和初始化实例变量owner self.amount = amount #创建和初始化实例变量amount account = Account("Tony",800000.0) print("账户名:{0}".format(account.owner)) #对实例变量通过"对象.实例变量"形式访问 print("账户金额:{0}".format(account.amount)) print("利率:{0}".format(Account.interest_rate)) #对类变量通过"类名.类变量"形式访问
9.4.5 类方法
class Account: interest_rate = 0.0668 #类变量利率 def __init__(self,owner,amount): self.owner = owner #创建和初始化实例变量owner self.amount = amount #创建和初始化实例变量amount #类方法 @classmethod #定义类方法需要的装饰器,装饰器以开头修饰函数方法和类,用来约束它们 def interest_by(cls,amt): return cls.interest_rate * amt interest = Account.interest_by(12000.0) print("计算利息:{0:.4f}".format(interest))
9.5.1 私有变量
class Account: __interest_rate = 0.0568 #类变量利率__interest_rate def __init__(self,owner,amount): self.owner = owner #创建并初始化公有实例变量owner self.__amount = amount #创建并初始化私有实例变量__amount def desc(self): #在类的内部可以访问私有变量 print("{0} 金额:{1} 利率:{2}。".format(self.owner, self.__amount, Account.__interest_rate)) account = Account("Tony",800000.0) account.desc() print("账户名:{0}".format(account.owner)) #print("账户金额:{0}".format(account.__amount)) 发生错误 #print("利率:{0}".format(Account.__interest_rate)) 发生错误
9.5.2 私有方法
class Account: __interest_rate = 0.0568 #类变量利率__interest_rate def __init__(self,owner,amount): self.owner = owner #创建并初始化公有实例变量owner self.__amount = amount #创建并初始化私有实例变量__amount def __get_info(self): #定义私有方法 return "{0} 金额:{1} 利率:{2}。".format(self.owner, self.__amount, Account.__interest_rate) def desc(self): #在类的内部可以调用私有方法 print(self.__get_info()) account = Account("Tony",800000.0) account.desc() #account.__get_info() 在类的外部调用私有方法,则会发生错误
9.5.3 使用属性
class Dog: #构造方法 def __init__(self,name,age,sex = "雌性"): self.name = name #创建和初始化实例变量name self.__age = age #创建和初始化私有实例变量__age #实例方法 def run(self): print("{}在跑...".format(self.name)) #get方法 def get_age(self): #定义get()方法,返回私有实例变量__age return self.__age #set方法 def set_age(self,age): #定义set()方法,通过参数更新私有实例变量__age self.__age = age dog = Dog("球球",2) print("狗狗年龄:{}".format(dog.get_age())) #通过get()方法取值 dog.set_age(3) #通过set()方法赋值 print("修改后狗狗年龄:{}".format(dog.get_age()))
class Dog: #构造方法 def __init__(self,name,age,sex = "雌性"): self.name = name #创建和初始化实例变量name self.__age = age #创建和初始化私有实例变量__age #实例方法 def run(self): print("{}在跑...".format(self.name)) @property def age(self): #替代get_age(self) return self.__age @age.setter def age(self,age): #替代set_age(self,age) self.__age = age dog = Dog("球球",2) print("狗狗年龄:{}".format(dog.age)) #通过get()方法取值 dog.age = 3 #通过set()方法赋值 print("修改后狗狗年龄:{}".format(dog.age))
9.6.1 Python中的继承
class Animal: #定义父类 def __init__(self,name): self.name = name #实例变量 def show_info(self): return "动物的名字{0}".format(self.name) def move(self): print("动一动...") class Cat(Animal): #定义子类猫 def __init__(self,name,age): super().__init__(name) #调用父类构造方法,初始化父类成员变量 self.age = age #实例变量 cat = Cat("Tom",2) cat.move() print(cat.show_info())
9.6.2 多继承
class Horse: def __init__(self,name): self.name = name def show_info(self): return "马的名字:{0}".format(self.name) def run(self): print("马跑...") class Donkey: def __init__(self,name): self.name = name def show_info(self): return "驴的名字{0}".format(self.name) def run(self): print("驴跑...") def roll(self): print("驴打滚...") class Mule(Horse,Donkey): def __init__(self,name,age): super().__init__(name) self.age = age m = Mule("骡宝莉",1) m.run() #继承父类Horse方法 m.roll() #继承父类Donkey方法 print(m.show_info()) #继承父类Horse方法
9.6.3 方法重写
class Horse: def __init__(self,name): self.name = name def show_info(self): return "马的名字:{0}".format(self.name) def run(self): print("马跑...") class Donkey: def __init__(self,name): self.name = name def show_info(self): return "驴的名字{0}".format(self.name) def run(self): print("驴跑...") def roll(self): print("驴打滚...") class Mule(Horse,Donkey): def __init__(self,name,age): super().__init__(name) self.age = age #实例变量age def show_info(self): return "骡:{0},{1}岁。".format(self.name,self.age) m = Mule("骡宝莉",1) m.run() #继承父类Horse方法 m.roll() #继承父类Donkey方法 print(m.show_info()) #子类Mule自己方法
9.7.1 继承与多态
class Aniaml: def speak(self): print("动物叫,但不知道是哪种动物叫!") class Dog(Aniaml): def speak(self): print("小狗:旺旺叫...") class Cat(Aniaml): def speak(self): print("小猫:喵喵叫...") animal1 = Dog() animal2 = Cat() animal1.speak() animal2.speak()
9.7.2 鸭子类型测试与多台
class Aniaml: def speak(self): print("动物叫,但不知道是哪种动物叫!") class Dog(Aniaml): def speak(self): print("小狗:旺旺叫...") class Cat(Aniaml): def speak(self): print("小猫:喵喵叫...") class Car: def speak(self): print("小汽车:滴滴叫...") def start(obj): #接收的obj对象具有speak()方法 obj.speak() start(Dog()) start(Cat()) start(Car())