第八章——两大编程思想:面向过程和面向对象
面向过程:简单的线性过程
面向对象:不能简单地使用线性表示,适合大型项目;
类和对象
python中不同的数据类型对应不同的类;
类的组成
class Student(): school='beijingxxxxx' def __init__(self,name,age): self.name=name#左侧是实例属性,右侧是局部变量,此处将局部变量的值赋给实例; self.age=age def show(self): print(f'my name is:{self.name}',f'my age is:{self.age}') @staticmethod def name(): print('静态方法不能调用实例方法实例属性') @classmethod def age(cls): print('类方法不能调用实例方法实例属性') #创建类对象 stu=Student(name='文明6',age=18) #实例属性使用对象名打点调用 print(stu.name,stu.age) #类属性,直接使用类打点调用 print(Student.school) #实例方法使用对象打点调用 stu.show() #类方法和静态方法都使用类名打点调用 Student.age() Student.name()
类的对象有多个
class Student():
school='beijingxxxxx'
def __init__(self,name,age):
self.name=name#左侧是实例属性,右侧是局部变量,此处将局部变量的值赋给实例;
self.age=age
def show(self):
print(f'my name is:{self.name}',f'my age is:{self.age}')
stu1=Student('zhang',18)
stu2=Student('awd',13)
stu3=Student('zhasdg',19)
stu4=Student('asf',24)
print(type(stu1))
Student.school='北大'
lst=[stu1,stu2,stu3,stu4]
for i in lst:
i.show()#遍历列表中的对象,对象名打点调用实例方法
class Student(): school='beijingxxxxx' def __init__(self,name,age): self.name=name#左侧是实例属性,右侧是局部变量,此处将局部变量的值赋给实例; self.age=age def show(self): print(f'my name is:{self.name}',f'my age is:{self.age}') stu=Student(name='文明6',age=18) stu2=Student(name='杀戮尖塔',age=20) print(stu.name,stu.age) print(stu2.name,stu2.age) stu2.gender='jibao' print(stu2.gender) def dongtaibangding(): print('我是普通函数,被动态绑定成stu2对象的方法') stu2.dongtai=dongtaibangding()
封装、继承、多态
目录
封装
class Student(): def __init__(self, name, age, score): self._name = name#受保护,本类子类使用 self.__age = age#私有,本类使用 self.score = score def _fun1(self): print('子类及本身可以访问') def __fun2(self): print('只有定义的类可以访问') def show(self): self._fun1()#类本身访问受保护的方法 self.__fun2() print(self._name) print(self.__age) stu=Student(name='df',age='18',score='25') print(stu._name) # print(stu.__age)AttributeError: 'Student' object has no attribute '__age' #私有的方法访问形式 print(stu._Student__age)
另一种访问私有属性的方法@property
继承
多子类
多父类
继承多个父类时,调用父类的方法不能使用super,只能使用父类的名称区别;
方法重写(super().xxx())
对于父类的方法可以不调用,可以完全重写!
调用方法时,子类有自己的方法则调用子类自己的方法(包括重写过的父类的方法),没有才调用父类的方法;
多态
(在程序运行过程中动态地决定调用哪个方法)
Object类
重写__str__方法
特殊方法
特殊属性
如果继承N多个父类,那么调用默认第一个父类;
类的拷贝
赋值
变量的或者对象的赋值前后,只有一个对象,指向的是同一片内存空间;
浅拷贝
只是产生了一个新的对象,但是其子对象没有变;
深拷贝
本章总结
实战
1.
import math #1 class Circle(): def __init__(self, radius): self.radius = radius def get_area(self): return math.pi * self.radius ** 2 def get_perimeter(self): return 2 * self.radius r=eval(input("Enter the radius of the circle: ")) c=Circle(r) area=c.get_area() perimeter=c.get_perimeter() print("The area of the circle is ", area) print("The perimeter of the circle is ", perimeter)
2.
3.
class In(): def __init__(self): pass def make_sound(self): pass class erhu(In): def make_sound(self): print('二胡在弹奏') class pinao(In): def make_sound(self): print('钢琴在弹奏') class violin(In): def make_sound(self): print('小提琴在弹奏') def main(obj): obj.make_sound() er=erhu() pi=pinao() vi=violin() main(pi) main(vi) main(er)
class Car(): def __init__(self, type,no): self.type = type self.no = no def start(self): print('gogogo') def stop(self): print('stopstopstop') class Taxi(Car): def start(self,type,no,company): super.__init__(type,no) self.company = company def start(self): print(f'我是{self.company}公司,车牌{self.no}') def stop(self): print('get out') class Familycar(Car): def __init__(self,type,no,name): super.__init__(type,no) self.name = name def start(self): print(f'我是{self.name}') def stop(self): print('下车') taxi=Taxi('asd','asd') taxi.start() taxi.stop() family=Familycar('fengtian','jiang666','wudalang') family.start() family.stop()