面向对象01
-
python 中一切皆对象
- 具有相同属性和方法的的某类事务适合用面向对象
- 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
- 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
- 具有相同属性和方法的的某类事务适合用面向对象
-
类与对象之间的关系
- 类 是一个大范围 一个模子 它约束了事物有哪些属性 不能约束具体的值
- 类有一个空间,存储的是定义在class中的所有名字
- 对象 是一个具体的内容 它遵循了类的约束 同时给属性赋上具体的值
- 每一个对象又拥有自己的空间,通过对象名.__dict__就可以查看这个对象的属性和值
- 在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,对象是则是这一类事物中具体的一个。
- 类 是一个大范围 一个模子 它约束了事物有哪些属性 不能约束具体的值
-
类有两种作用:属性引用和实例化
-
实例化所经历的步骤
- 类名() 之后的第一个事儿 :开辟一块儿内存空间
- 调用 init 把空间的内存地址作为self参数传递到函数内部
- 所有的这一个对象需要使用的属性都需要和self关联起来
- 执行完init中的逻辑之后,self变量会自动的被返回到调用处(发生实例化的地方)
-
类的属性
class Person: #加载就执行 def __init__(self,name,sex,job,hp,weapon,ad): #必须叫这个名字不能改变,所有的一个具体的任务出现之后同意的属性 self.name = name self.sex = sex self.job = job self.level = 0 self.hp = hp self.weapon = weapon self.ad = ad alex = Person('alex','不详','搓澡工',250,'搓澡巾',1) wusir = Person('wusir','male','法师',500,'打狗棍',1000) print(alex.__dict__) print(wusir.__dict__)#类名.__dict__:是一个字典,key为属性名,value为属性值 print(wusir.name) #wusir 属性的查看 alex.name = 'alexsb'#属性修改 alex.maney = 1000000#属性的增加 # #self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字,但是正常人都不会这么做。 #类名.__name__# 类的名字(字符串) #类名.__doc__# 类的文档字符串 #类名.__base__# 类的第一个父类 #类名.__bases__# 类所有父类构成的元组 #类名.__dict__# 类的字典属性 #类名.__module__# 类定义所在的模块 #类名.__class__# 实例对应的类(仅新式类中)
-
类的方法
class Person: def __init__(self,name,sex,job,hp,weapon,ad): self.name = name self.sex = sex self.job = job self.level = 0 self.hp = hp self.weapon = weapon self.ad = ad def 搓(self,dog):# 方法必须传参 if dog.blood > self.ad: dog.blood -= self.ad else: dog.blood = 0 print(f'{self.name}给{dog.name}搓澡 {dog.name}掉了{self.ad}点血 {dog.name}当前血量{dog.blood}点') class Dog: def __init__(self,name,blood,aggr,kind): self.name = name self.kind = kind self.blood = blood self.aggr = aggr def tian(self,person): if person.hp > self.aggr: person.hp -= self.aggr else: person.hp = 0 print(f'{self.name}给{person.name}搓澡 {person.name}掉了{self.aggr}点血 {person.name}当前血量{person.hp}点') 小白 = Dog('小白',5000,249,'泰迪') alex = Person('alex','不详','搓澡工',250,'搓澡巾',1) wusir = Person('wusir','male','法师',500,'打狗棍',1000) alex.搓(小白)#通过实例化的对象点方法来调用 小白.tian(alex) 小白.tian(alex)
-
组合 命名空间
-
类 : 有什么属性 有什么方法 不能知道属性对应的值
-
对象: 之前所有的属性都有明确的值
- 变量名 = 对象 所有对象都有一个类型
- class A实例化出来的对象类型就是A类
- 'asda'的类型就是字符串 123的类型就是int
-
类的成员和命名空间
-
类中的变量是静态变量
-
对象中的变量只属于对象本身每个对象有属于自己的空间来存储对象的变
-
当使用对象名去调用某一个属性的适合就会优先在自己的空间中寻找 找不到再去对应的类中寻找
-
如果自己没有就引用类的,如果类也没有就报错
-
对于类来说,类中的变量所有的对象都是可以读取的,并且读取的是同一份变量
class A: Country = '中国'#静态变量/静态属性 存储在类的命名空间 def __init__(self,name,age,country): #绑定方法 存储在类的命名空间 self.name = name self.age = age self.Country = country def func(self):pass def func1(self):pass def func2(self):pass a = A('alex',83,'印度')# 对象能找到类 有一个指针 类无法找到对象 b = A('wusir',74,'泰国')# 对象能找到类 有一个指针 类无法找到对象 print(a.name) A.Country = '日本人' print(a.Country) print(b.Country) print(A.Country) #小练习 #实现一个类能够自动统计这个类实例化了多少个对象 class A: count = 0 def __init__(self): A.count += 1 a = A() print(A.count) b = A() print(A.count) c = A() print(A.count) 类当中静态变量的用处 如果一个变量 是所有对象共享的值 那么这个变量应该被定义成静态变量 所有和静态变量相关的增删改查都应该使用类名来处理 组合 一个类的对象是另外一个类对象的属性
-
-
组合
#一个类的对象可以是另外一个类对象的属性 #学生类 #姓名 性别 年龄 学号 班级 手机号 class Student: def __init__(self,name,sex,age,num,clas,phone): self.name =name self.sex =sex self.age =age self.clas =clas self.phone =phone self.num =num # 班级信息 # 班级名 开班时间 当前讲师 class Clas: def __init__(self,cname,begint,teacher,curriculum): self.cname = cname self.begint = begint self.teacher = teacher self.curriculum = curriculum # 课程 #课程的名称 课程周期 课程价格 class Curriculum: def __init__(self,name,cycle,price): self.name = name self.cycle = cycle self.price = price python = Curriculum('python','6个月',20000) linux = Curriculum('linux','5个月',18000) python_22 =Clas('python22期','2019-4-26','太白',python) linux_57=Clas('linux57期','不详','不详',linux) print(python_22.curriculum.name) print(python_22.curriculum.price) print(linux_57.curriculum.name) print(linux_57.curriculum.price)