Python从入门到高手(内部资源-配学习资料)_哔哩哔哩_bilibili
# 私有化 # 封装:1.私有化属性 2.定义公有set和get方法 # __属性:就是将属性私有化,访问范围仅仅限于类中 ''' 1.隐藏属性不被外界随意修改 2.可以修改:通过函数def setXXX(self,XXX):3.筛选赋值内容if XXX是符合条件赋值else:不赋值 3.如果想获取某一个属性使用get函数def getXXX(self):return self.__XXX '''class Student:__age = 18 # 类属性def __init__(self, name, age):self.__name = name # 长度必须6位self.__age = ageself.__score = 25# 定义公有set(赋值)和get(取值)方法def setAge(self, age):if age > 0 and age < 120:self.__age = ageelse:print('年龄不在规定的范围内')def getAge(self):return self.__age# 修改名字的时候,长度必须6位def setName(self, name):if len(name) == 6:self.__name = nameelse:print('长度不是6位')def getName(self):return self.__namedef __str__(self):return '姓名:{},年龄:{},考试分数:{}'.format(self.__name, self.__age, self.__score)yupeng = Student('yupeng', 18) print(yupeng)yupeng.age = 21 yupeng.__score = 95 # 赋值不成功 print(yupeng) yupeng.setAge(50) print(yupeng.getAge())-----------------------------------------------------------------------------------
class Student:__age = 18 # 类属性def __init__(self, name, age):self.__name = name # 长度必须6位self.__age = ageself.__score = 25# 定义公有set(赋值)和get(取值)方法def setAge(self, age):if age > 0 and age < 120:self.__age = ageelse:print('年龄不在规定的范围内')def getAge(self):return self.__age# 修改名字的时候,长度必须6位def setName(self, name):if len(name) == 6:self.__name = nameelse:print('长度不是6位')def getName(self):return self.__namedef __str__(self):return '姓名:{},年龄:{},考试分数:{}'.format(self.__name, self.__age, self.__score)# attribute: setName getName __str__ __init__yupeng = Student('yupeng', 18) print(yupeng)print(dir(Student)) print(dir(yupeng)) print(yupeng._Student__age) # 伪私有,其实就是__age,只不过系统自动改名字了
------------------------------------------------------------------------------------------------------------------
# 在开发中看到一些私有化处理:装饰器 class Student:__age = 18 # 类属性def __init__(self, name, age):self.name = name # 长度必须6位self.__age = age# 定义公有set(赋值)和get(取值)方法# 老版# def setAge(self, age):# if age > 0 and age < 120:# self.__age = age# else:# print('年龄不在规定的范围内')## def getAge(self):# return self.__age# 先有getXXX,再有set,get依赖于set@propertydef age(self):return self.__age@age.setterdef age(self, age):if age > 0 and age < 120:self.__age = ageelse:print('年龄不在规定的范围内')def __str__(self):return '姓名:{},年龄:{},考试分数:{}'.format(self.__name, self.__age, self.__score)s = Student('peng', 20)s.name = 'xiaopeng' s.age = 30 print(s.name) print(s.age)# 私有化赋值 # s.setAge(30) # print(s.getAge())
-----------------------------------------------------------------------------------------------------------------
# 继承:is a, has a ''' 公路(Road):属性:公路名称,公路长度 车(Car):属性:车名,时速方法:1.求车名在那条公路上以多少的时速行驶多长,get_time(self,rood)2.初始化车属性信息__init__方法3.打印对象显示车的属性信息 ''' import randomclass Road:def __init__(self, name, len):self.name = nameself.len = lenclass Car:def __init__(self, brand, speed):self.brand = brandself.speed = speeddef get_time(self, road): # road与r指向同一个空间地址ran_time = random.randint(1, 10)msg = '{}品牌的车在{}上以{}速度行驶{}小时'.format(self.brand, road.name, self.speed, ran_time)print(msg)def __str__(self):return '{}品牌的,速度:{}'.format(self.brand, self.speed)# 创建实例化对象 r = Road('京藏高速', 12000) # road与r指向同一个地址空间 audi = Car('奥迪', 120) r.name = '京哈高速' print(audi) audi.get_time(r) # 对象
------------------------------------------------------------------------------------------------------------
''' 知识点: 1.has a 一个类中使用了另外一种自定义的类型student使用computer book2.类型 系统类型 str int float list dict tuple set 自定义类型: 算是自定义的类,都可以将其当成一种类型 s=Student s是Student类型的对象 '''class Computer:def __init__(self, brand, type, color):self.brand = brandself.type = typeself.color = colordef online(self):print('正在使用电脑上网...')def __str__(self):return self.brand + '---' + self.type + '---' + self.colorclass Book:def __init__(self, bname, author, number):self.bname = bnameself.author = authorself.number = numberdef __str__(self):return self.bname + '---' + self.author + '---' + str(self.number)class Student:def __init__(self, name, computer, book):self.name = nameself.computer = computerself.books = []self.books.append(book)def borrow_book(self, book):for book1 in self.books:if book1.bname == book.bname:print('已经借过了')breakelse:# 将参数book添加到列表中self.books.append(book)print('添加成功!')def show_book(self):for book in self.books: # book就是一个book对象print(book.bname)def __str__(self):return self.name + '---' + str(self.computer) + '---' + str(self.books)computer = Computer('Dell', 'R14', 'black') book = Book('盗墓笔记', '南派三叔', 10) stu = Student('songsong', computer, book) print(stu) # 看借了哪些书 stu.show_book() book1 = Book('鬼吹灯', '天下霸唱', 8) stu.borrow_book(book1) stu.show_book()
------------------------------------------------------------------------------------------------
# is a base 父类 基类 # Exception ''' 继承: Student,Employee,Doctor ------》都属于人类 相同代码---》代码冗余,可读性不高将相同代码提取---》Person类 Student,Employee,Doctor---》继承Personclass Student(Person):pass '''class Person:def __init__(self, name, age):self.name = '匿名'self.age = 18def eat(self):print(self.name + '正在吃饭。。。')def run(self):print(self.name + '正在跑步。。。')class Student(Person):def __init__(self, name, age):# 调用父类的__init__super().__init__(name, age) # super() 父类对象print('------>student的init')class Employee(Person):passclass Doctor(Person):passs = Student('renwen', 18) s.run()# e = Employee() # d = Doctor()
-----------------------------------------------------------------------------------------------
''' 特点: 1.如果类中不定义__init__,调用父类super class的__init__ 2.如果类继承父类也需要定义自己的__init__,就需要在当前类的__init__调用一下父类__init__ 3.如何调用父类__init__:super().__init__:super().__init__(参数)super(类名,对象).__inint(参数) 4.如果父类有eat(),子类也定义一个eat方法,默认搜索的原则:先找当前类,再去找父类s.eat()override:重写(覆盖)父类提供的方法不能满足子类的需求,就需要在子类中定义一个同名的方法,这种行为:重写 5.子类的方法也可以调用父类方法:super().方法名(参数) '''class Person:def __init__(self, name, age):self.name = nameself.age = agedef eat(self):print(self.name + '正在吃饭。。。')def run(self):print(self.name + '正在跑步。。。')class Student(Person):def __init__(self, name, age, clazz):# 调用父类的__init__super().__init__(name, age) # super() 父类对象self.clazz = clazzprint('------>student的init')def study(self, course):print('{}正在学习{}课程'.format(self.name, course))def eat(self, food):super.eat()print(self.name + '在吃狮子头盖饭' + food)class Employee(Person):def __init__(self, name, age, salary, manager):super().__init__(name, age)self.salary = salaryself.manager = managerclass Doctor(Person):def __init__(self, name, age, patients):super(Doctor, self).__init__(name, age)self.patients = patientss = Student('jack', 18, 'python1905') s.study('python') s.eat('鱼香肉丝')e = Employee(name='tom', age=25, salary=10000, manager='king')lists = ['zhangsan', 'lisi', 'wangwu', 'zhaoliu'] d = Doctor('lucy', 30, lists)
----------------------------------------------------------------------------------------------
# class Person: # def __init__(self, name): # self.name = name # # def eat(self): # print('------>eat1') # # def eat(self, food): # print('------>eat', food) # # # p = Person('jack') # p.eat('狮子头')class Base:def test(self):print('------Base------')class A(Base):def test(self):print('------>AAAAAA')class B(Base):def test1(self):print('------>BBBBBB')class C(Base):def test2(self):print('------>CCCCCC')class D(A, B, C):passd = D() d.test()import inspectprint(inspect.getmro(D))''' python允许多继承, def 子类(父类1,父类2,...):pass 如果父类中有相同名称的方法 '''
-----------------------------------------------------------------
# 多继承的搜索顺序:经典类 新式类class P1:def foo(self):print('p1--->foo')def bar(self):print('p1--->bar')class P2:def foo(self):print('p2--->foo')class C1(P1, P2):passclass C2(P1, P2):def bar(self):print('C2--->bar')class D(C1, C2):passd = D() d.foo()# 广度优先
------------------------------------------------------------------------------------------
# 多态 封装 继承----》面向对象 class Person:def __init__(self, name):self.name = namedef feed_pet(self, pet): # pet既可以接收cat,也可以接收dog,还可以接收tiger# isinstance(obj,类) ------》 判断obj是不是类的对象或者判断obj是不是该类子类的对象if isinstance(pet, Pet):print('{}喜欢养宠物:{},昵称是:{}'.format(self.name, pet.role, pet.nickname))else:print('不是宠物类型的。。。')class Pet:role = 'Pet'def __init__(self, nickname, age):self.nickname = nicknameself.age = agedef show(self):print('昵称:{},年龄:{}'.format(self.nickname, self.age))class Cat(Pet):role = '猫'def catch_mouse(self):print('抓老鼠。。。')class Dog(Pet):role = '狗'def watch_house(self):print('看家高手。。。')class Tiger:def eat(self):print("太可怕了,可以吃人。。。")# 创建对象 cat = Cat('花花', 2) dog = Dog('大黄', 4) tiger = Tiger() person = Person('家伟') person.feed_pet(cat) person = Person('pengpeng') person.feed_pet(tiger)''' pet 父类 cat dog子类 pet 大类型 cat dog小类型 '''
-----------------------------------------------------------------------------------------