admin管理员组

文章数量:1794759

Lesson

Lesson

1.init 魔法方法

  • 在实例创建的时候就会直接调用
  • init方法携带self以外的参数,那么创建实例的时候必须传入这个属性
class Person:# 当变量不存在的时候,要么导入,要么创建# 导入:import  xxxx    import random   导入时导入python存在的包或者你自己写的模块def __init__(self, name):# print('hello')self.name = name# self 就是实例对象def speak(self):print('大家好,我是%s' % self.name)# print(s)# def run(self):# __init__ 方法在实例创建的时候默认调用  类的初始化
p1 = Person('刘亦菲')
# p1.__init__()
# p1.name = '邱淑贞'
p2 = Person('邱淑贞')
# p2.name = '刘亦菲'
# p1.speak()
# p2.speak()
p3 = Person('关之琳')	#创建变量
p3.speak()# 目前对于程序来说,没有name就会报错,是必须的
# name不相同,所以不能定义在类中
# 手动添加name属性没有提示容易遗忘# 当我们创建实例对象的时候,就给我们提示,你需要添加什么属性,不添加则不能创建示例对象
# __init__()方法

2.封装

  • name
  • 完全封装:__name
@property 
def name(self): # getter方法 return self._name 
@name.setter # setter方法 def name(self, name): self._name = name
# 封装: 为了保障数据的安全性和程序的正确性,我们要协定一个方式,来将参数保护起来
# 封装是一种思想,保护数据的可靠性的思想,而不是真正的不能够修改的数据   (防君子不防小人)# class Car():
#
#     def __init__(self, name, color):
#         # 属性名称   值
#         self.name = name
#         self.color = color
#
#     def run(self):
#         print('汽车开始跑了')
#
#     def laba(self):
#         print('滴滴滴')
#
#
# # car = Car('奔驰', '黑色')
# c = Car('大狼狗', '黑色')
#
# # print(car.name, car.color)
# # car.run()
# # car.laba()
#
# c.run()
# c.laba()# 封装是面向对象的三大特性之一  : 继承、多态# class Car():
#
#     def __init__(self, name, color):
#         # 属性名称   值
#         # 这种方式告诉别人这个是私有属性,不要轻易修改
#         self.hidden_name = name
#         self.hidden_color = color
#
#     def run(self):
#         print('汽车开始跑了')
#
#     def laba(self):
#         print('滴滴滴')
#
#
# car = Car('奔驰', '黑色')
# # 语法: 对象.属性名 = 属性值  :   设置或者修改属性值
# car.hidden_name = '五菱宏光'
# car.name = '宝马'  # 相当于重新创建了一个属性
# print(car.hidden_name)
# print(car.name)# class Car():
#
#     def __init__(self, name, color):
#         # 属性名称   值
#         # 这种方式告诉别人这个是私有属性,不要轻易修改
#         # __name 叫做完全封装  私有属性
#         self.__name = name
#         self.__color = color
#
#     def run(self):
#         print('汽车开始跑了')
#
#     def laba(self):
#         print('滴滴滴')
#
#     # getter方法 setter方法
#     # getter方法用查看私有属性  如果只有一个getter方法,没有setter方法:这个属性是一个只读属性
#     def get_name(self):
#         return self.__name
#
#     # setter方法是用来修改私有属性
#     def set_name(self, name):
#         self.__name = name
#
#
# car = Car('奔驰', '黑色')
# # _类名__属性名	类名前面一个横杠,属性名前面两个横杠
# # print(car._Car__name)
# # car.__name = '雪佛兰'  这种方式是外行 没有工作经验的程序员
# print(car.get_name())
# # print(car.set_name('宝马'))
# print(car.get_name())class Car():def __init__(self, name, color):# 属性名称   值# 这种方式告诉别人这个是私有属性,不要轻易修改# _name  私有属性self._name = nameself._color = colordef run(self):print('汽车开始跑了')def laba(self):print('滴滴滴')# getter方法 setter方法# getter方法用查看私有属性  如果只有一个getter方法,没有setter方法:这个属性是一个只读属性def get_name(self):return self._name# setter方法是用来修改私有属性def set_name(self, name):self._name = namecar = Car('奔驰', '黑色')
# print(car._name)  # 没有工作经验
print(car.get_name())
  • getter方法和setter方法的property装饰器
class Person():def __init__(self, name):self._name = name# getter 方法# property装饰器@propertydef name(self):print('get 方法执行了')return self._name# setter方法的property装饰器的使用@name.setterdef name(self, name):print('set 方法执行了')self._name = namep1 = Person('邱淑贞')print(p1.name)
p1.name = '刘亦菲'
print(p1.name)

3.继承

  • issubclass() 方法
    • 用于判断参数 class 是否是类型参数 classinfo 的子类。
    • 语法:issubclass(class, classinfo)
    • 参数 calss—类 classinfo—类
    • 返回值:如果 class 是 classinfo 的子类返回 True,否则返回 False。
class A:pass
class B(A):passprint(issubclass(B,A))    # 返回 True
  • isinstance()
    • 判断一个对象是否是一个已知的类型,类似 type()。

    • 语法:isinstance(object, classinfo)

    • 参数:object—对象 classinfo—可以是直接或间接类名、基本类型或者由它们组成的元组。

    • 返回值:如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。

    >>>a = 2
    >>> isinstance (a,int)
    True
    >>> isinstance (a,str)
    False
    >>> isinstance (a,(str,int,list))    # 是元组中的一个返回True
    True
    
  • isinstance() 与 type() 区别:
    	type() 不会认为子类是一种父类类型,不考虑继承关系。isinstance() 会认为子类是一种父类类型,考虑继承关系。如果要判断两个类型是否相同推荐使用 isinstance()。
    
  • 简介
    • 让类与类产生关系,拿到它里面的属性和方法
class Animal():def sleep(self):print('动物会睡觉')def run(self):print('动物会跑')# 定义一个狗类
# 1. 直接在动物类上面修改   违反ocp
# 2. 创建一个新的类(狗类)   会出现大量重复的代码
# 3. 直接从动物类中间拿到属性和方法 (推荐)=>  继承:就是在定义类名之后的括号里写上继承的父类(超类)class Dog(Animal):passdog = Dog()dog.run()
dog.sleep()# 检测是否是类创建的实例对象
# res = isinstance(dog, Dog)
# print(res)# 检测是否是当前类的父类  issubclass
# res = issubclass(Dog, Animal)
# print(res)# object 是所有类的父类
# res = issubclass(Animal, object)
# print(res)
  • super():在继承的基础上,重写了父类的方法,现在又想调用父类的方法,所以用super()
class Animal(object):def __init__(self, name):self._name = namedef sleep(self):print('动物会睡觉')def run(self):print('动物会跑')def get_name(self):print('get 方法调用了')return self._nameclass Dog(object):def __init__(self, gender):self.gender = genderclass Zhonghua(Animal, Dog):def __init__(self, age, name, gender):super().__init__(gender)super().__init__(name)self.gender = genderself._name = nameself.age = agedef sleep(self):super().sleep()print('狗会睡觉')def run(self):print('狗会跑')dog = Zhonghua('中华田园犬', 18, '男')
dog.sleep()
# print(dog.get_name())print(type(Zhonghua))
print(issubclass(Zhonghua, type))
print(issubclass(type, object))
'''# 解耦合  1. 提高问题的解决概率   2. 提高问题的解决效率  3. 提高解决问题的速度  4. 降低爆发隐患的可能性# 多重继承: 兄弟类中都有相同的方法,那么先调用写到前面的那个类的方法

本文标签: Lesson