一、面向对象初识
python中一切皆对象。
类有两种:
新式类:在py3中所有类都是新式类
经典类:在py2中只有类本身继承了object类才叫做新式类,默认是经典类
class Person: country = "中国" # 静态属性 def __init__(self, name, age, sex): # 初始化对象 在实例化时自动将对象/实例本身传给__init__的第一个参数。 self.name = name self.age = age self.sex = sex def eat(self): # 动态属性或方法 return "%s在吃饭" % self.name # 访问类的属性 print(Person.country) print(Person.__dict__) # 查看类具有的属性和方法 # 实例化 实例化会自动执行__init__方法,可以用它来为每个实例对象定制自己的特征 spf = Person("spf", 18, "男") # 类名() 就等于在执行Person.__init__(),执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。 # 访问类的属性和方法 print(Person.eat(spf)) print(spf.eat())
class Person: def __init__(self, name, sex, hp, dps, bag=[]): """ 人的特性 :param name: 昵称 :param sex: 年龄 :param hp: 血量 :param dps: 攻击力 :param bag: 背包 """ self.name = name self.sex = sex self.hp = hp self.dps = dps self.bag = bag def hit(self, dog): """ 方法:人打狗 :param dog: 实例化的狗 :return: """ dog.hp -= self.dps print("Info:{0}打了{1},{1}掉了{2}血,剩余{3}血".format(self.name, dog.name, self.dps, dog.hp)) class Dog: def __init__(self, name, kind, hp, dps): """ 人的特性 :param name: 昵称 :param kind: 品种 :param hp: 血量 :param dps: 攻击力 """ self.name = name self.kind = kind self.hp = hp self.dps = dps def hit(self, person): """ 方法:狗咬人 :param person: 实例化后的人 :return: """ person.hp -= self.dps print("Info:{0}咬了{1},{1}掉了{2}血,剩余{3}血".format(self.name, person.name, self.dps, person.hp)) alex = Person("金角大王", "男", 5000, 300) hsq = Dog("旺财", "哈士奇", 50000, 500) alex.hit(hsq) # Info:金角大王打了旺财,旺财掉了300血,剩余49700血 hsq.hit(alex) # Info:旺财咬了金角大王,金角大王掉了500血,剩余4500血 print(alex.hp) # 4500 print(hsq.hp) # 47900
from math import pi class Yuan: def __init__(self,r): """ 圆的属性 :param r: 半径 """ self.r = r def mj(self): """ 求圆面积方法 :return: 圆面积 """ return pi * self.r ** 2 def zj(self): """ 求圆的周长 :return: 圆周长 """ return 2 * pi * self.r yuna1 = Yuan(5) print(yuna1.mj())
二、面向对象命名空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
静态属性就是直接在类中定义的变量
动态属性就是定义在类中的方法
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
class Person: person = "人" # 静态属性,也可以叫公共属性 name = "wxx" # 当init对象命名空间中没有name的时候会找类命名空间中的name def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex p1 = Person("spf", 18, "男") print(p1.name)
三、面向对象的组合
组合的定义:在一个类中以另外一个类的对象作为数据属性,称为类的组合
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,例如:人有武器
# 人狗大战,给人增加武器 class Person: def __init__(self, name, sex, hp, dps, bag=[]): """ 人的特性 :param name: 昵称 :param sex: 年龄 :param hp: 血量 :param dps: 攻击力 :param bag: 背包 """ self.name = name self.sex = sex self.hp = hp self.dps = dps self.bag = bag def hit(self, dog): """ 方法:人打狗 :param dog: 实例化的狗 :return: """ dog.hp -= self.dps print("Info:{0}打了{1},{1}掉了{2}血,剩余{3}血".format(self.name, dog.name, self.dps, dog.hp)) class Dog: def __init__(self, name, kind, hp, dps): """ 人的特性 :param name: 昵称 :param kind: 品种 :param hp: 血量 :param dps: 攻击力 """ self.name = name self.kind = kind self.hp = hp self.dps = dps def hit(self, person): """ 方法:狗咬人 :param person: 实例化后的人 :return: """ person.hp -= self.dps print("Info:{0}咬了{1},{1}掉了{2}血,剩余{3}血".format(self.name, person.name, self.dps, person.hp)) class Wuqi: def __init__(self, name, dps, price): """ 武器的属性 :param name: 名称 :param dps: 攻击力 :param price: 价格 """ self.name = name self.dps = dps self.price = price def baozi(self,dog): """ 武器:毒包子 :param dog: 狗对象 :return: """ dog.hp -= self.dps print("%s吃了%s掉了%s血剩余%s血" % (dog.name, self.name, self.dps, dog.hp)) roubaozi = Wuqi("肉包子", 5000, 3000) # 实例化一个Wuqi对象roubaozi alex = Person("金角大王", "男", 5000, 300, [5000]) # 实例化一个Person对象alex hsq = Dog("旺财", "哈士奇", 50000, 500) # 实例化一个Dog对象hsq if alex.bag[0] >= roubaozi.price: # 判断alex的钱够不够买武器 alex.wuqi = roubaozi # 给alex添加一个武器 alex.wuqi.baozi(hsq) # alex使用武器
# 求圆环面积和周长 from math import pi class Yuan: """ 圆面积和圆周长 """ def __init__(self,r): """ 圆的属性 :param r: 半径 """ self.r = r def mj(self): """ 求圆面积方法 :return: 圆面积 """ return pi * self.r ** 2 def zj(self): """ 求圆的周长 :return: 圆周长 """ return 2 * pi * self.r class Yuanhuan: """ 圆环的面积和周长 """ def __init__(self, outer_r, inner_r): """ 圆环的属性 :param outer_r: 大圆的半径 :param inner_r: 小圆的半径 """ self.outer = Yuan(outer_r) # outer = 实例化的圆对象 self.inner = Yuan(inner_r) # inner = 实例化的圆对象 def yh_mj(self): """ 求圆环的面积,大圆-小圆 :return: """ # 圆对象有mj方法 return self.outer.mj() - self.inner.mj() def yh_zc(self): """ 求圆环的周长 :return: """ # 圆对象有zc方法 return self.outer.zj() + self.inner.zj() yh1 = Yuanhuan(10, 5) # 实例化圆环 print(yh1.yh_mj()) # 求圆环面积 print(yh1.yh_zc()) # 求圆环周长
四、面向对象的三大特性
1、继承
继承的定义:继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类
继承的作用:1、减少代码的重用 2、提高代码可读性 3、规范编程模式
抽象:抽象即抽取类似或者说比较像的部分。是一个从具题到抽象的过程。
继承:子类继承了父类的方法和属性
派生:子类在父类方法和属性的基础上产生了新的方法和属性
继承顺序:
经典类:深度优先
新式类:广度优先
扫描二维码关注公众号,回复:
902550 查看本文章
# 人和狗都属于动物 class Animal: def __init__(self, name, hp, dps): """ 动物的属性 :param name: 昵称 :param hp: 血量 :param dps: 攻击力 """ self.name = name self.hp = hp self.dps = dps def hit(self,argv): argv.hp -= self.dps print("Info:{0}打了{1},{1}掉了{2}血,剩余{3}血".format(self.name, argv.name, self.dps, argv.hp)) class Person(Animal): def __init__(self, name, sex, hp, dps, bag=[]): """ 人的特性 :param name: 昵称 :param sex: 年龄 :param hp: 血量 :param dps: 攻击力 :param bag: 背包 """ # Animal.__init__(name, hp, dps) super().__init__(name, hp, dps) self.sex = sex self.bag = bag class Dog(Animal): def __init__(self, name, kind, hp, dps): """ 人的特性 :param name: 昵称 :param kind: 品种 :param hp: 血量 :param dps: 攻击力 """ super().__init__(name, hp, dps) self.kind = kind alex = Person("金角大王", "男", 5000, 300) hsq = Dog("旺财", "哈士奇", 50000, 500) alex.hit(hsq) # Info:金角大王打了旺财,旺财掉了300血,剩余49700血 hsq.hit(alex) # Info:旺财咬了金角大王,金角大王掉了500血,剩余4500血 print(alex.hp) # 4500 print(hsq.hp) # 47900
class A: def func(self): print("in A") class B(A): # 单继承 def func(self): print("in B") class C(A): def func(self): print("in C") class D(B, C): # 多继承 def func(self): print("in D") print(D.__bases__) print(D.mro()) # 查看类的继承顺序 [<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
# 在python3中,子类执行父类的方法也可以直接用super方法. class A: def __init__(self, name, sex): self.name = name self.sex = sex def func(self): print("in A") class B(A): def __init__(self, name, sex, add): # A.__init__(name,sex) super().__init__(name, sex) # 支持父类的属性 self.add = add def func(self): super().func() # 执行父类的方法 obj = B("spf","男","HN") obj.func() print(obj.__dict__)
2、多态
3、封装