zoukankan      html  css  js  c++  java
  • Python之面向对象、封装继承多态

    一、类

    类:把一类事物的相同的特征和相同的动作整合到一起

    二、对象

    对象:特征与动作的结合由这个类产生的,具体的存在

    三、面向对象设计

    面向对象只是一个思想 基于函数

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 
     5 def dog(name, gender, category):  # 有狗这个类的思想
     6     def init(name, gender, category):
     7         dog1 = {
     8             "name": name,
     9             "gender": gender,
    10             "category": category,
    11             "jiao": jiao,
    12             "chi_shi": chi_shi
    13         }
    14         return dog1
    15 
    16     def jiao(dog):
    17         print('一条狗【%s】正在汪汪汪的叫唤' % name)
    18 
    19     def chi_shi(dog):
    20         print('一条狗【%s】正在吃屎' % name)
    21 
    22     return init(name, gender, category)
    23 
    24 
    25 d1 = dog("eric", "雄性", "藏獒")  # 有对象思想
    26 print(d1)
    27 d1["jiao"](d1)
    28 d1["chi_shi"](d1)

    面向对象只是一个思想 基于类

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 
     5 class Dog:
     6     def __init__(self, name, gender, category):
     7         self.name = name
     8         self.gender = gender
     9         self.category = category
    10 
    11     def jiao(self):
    12         print('一条狗【%s】正在汪汪汪的叫唤' % self.name)
    13 
    14     def chi_shi(self):
    15         print('一条狗【%s】正在吃屎' % self.name)
    16 
    17 
    18 d1 = Dog('eric', '雄性', '藏獒')
    19 print(dir(Dog))
    20 print(d1.__dict__)
    21 d2 = Dog('alex', '雄性', '京巴')
    22 d1.jiao()
    23 d2.jiao()

     四、类相关(类的数据属性和函数属性)

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 
     5 class Chinese(object):
     6     """中国人类"""
     7     # 数据属性
     8     governb = "NB"
     9 
    10     # 函数属性
    11 
    12     def sui_di_tu_tan(self):
    13         print("随地吐痰")
    14 
    15     def cha_dui(self):
    16         print("插队")
    17 
    18 
    19 print(Chinese.governb)
    20 Chinese.sui_di_tu_tan("eric")
    21 Chinese.cha_dui("yuanhao")
    22 print(dir(Chinese))  # 查看这个类系统及全部的属性
    23 print(Chinese.__dict__)  # 查看类属性字典
    24 Chinese.__dict__['sui_di_tu_tan']("eric")
    25 print(Chinese.__module__)
    26 print(Chinese.__bases__)
    27 """
    28 #python为类内置的特殊属性
    29 类名.__name__# 类的名字(字符串)
    30 类名.__doc__# 类的文档字符串
    31 类名.__base__# 类的第一个父类
    32 类名.__bases__# 类所有父类构成的元组
    33 类名.__dict__# 类的字典属性
    34 类名.__module__# 类定义所在的模块
    35 类名.__class__# 实例对应的类
    36 
    37 """

    五、对象相关以及类增删改查

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 
     5 class Chinese:
     6     """这是一个中国人的类"""
     7     country = "china"
     8 
     9     def __init__(self, name, age, gender):
    10         """
    11         函数默认返回的是None
    12         自动为self封装数据返回字典形式
    13         {'name': 'eric', 'age': 18, 'gender': '女'}
    14         :param name:
    15         :param age:
    16         :param gender:
    17         """
    18         self.name = name
    19         self.age = age
    20         self.gender = gender
    21 
    22     def sui_di_tu_tan(self):
    23         print("[%s]吐痰" % self.name)
    24 
    25     def cha_dui(self):
    26         print("[%s]插队" % self.name)
    27 
    28     def eat_food(self, food):
    29         print("[%s]正在吃【%s】" % (self.name, food))
    30 
    31 
    32 p1 = Chinese("eric", 18, "")  # 实例化就是执行初始化函数__init__方法  self就是实例化的这个对象即p1
    33 print(dir(p1))
    34 print(p1.__dict__)
    35 print(p1.__dict__['gender'])
    36 print(p1.gender)
    37 print(p1.country)
    38 Chinese.sui_di_tu_tan(p1)
    39 # p1.sui_di_tu_tan()=Chinese.sui_di_tu_tan(p1)  实例一定能访问类的函数属性 实例其实没有函数属性它是调用的类的函数属性
    40 p1.sui_di_tu_tan()
    41 p1.cha_dui()
    42 p1.eat_food("")
    43 
    44 # 类属性增删改查(数据属性函数属性都是相同道理)
    45 # 查看
    46 print(Chinese.country)
    47 
    48 # 修改
    49 Chinese.country = "Shanghai"
    50 print(Chinese.country)
    51 
    52 # 增加
    53 Chinese.sichuan = "Chengdu"
    54 print(Chinese.sichuan)
    55 
    56 
    57 # 删除
    58 del(Chinese.sichuan)
    59 print(Chinese.__dict__)
    60 
    61 # 增加函数属性
    62 
    63 
    64 def play_ball(self, ball):
    65     print("%s正在打%s球" % (self.name, ball))
    66 
    67 
    68 Chinese.play = play_ball
    69 p1.play('')
    70 print(dir(Chinese))  # 列表形式
    71 print(Chinese.__dict__)  # 字典形式

    六、实例相关增删改查

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 china = "中国"
     5 
     6 
     7 class People:
     8 
     9     def __init__(self, name):
    10         self.name = name
    11         print('------>', china)
    12 
    13     def play_ball(self, ball):
    14         print("%s正在打%s" %(self.name, ball))
    15 
    16 
    17 p1 = People("eric")  # 这里要打印中国哈  print('------>', china)跟类没任何关系  只有通过字典People.china p1.china调用才报错
    18 print(p1.__dict__)
    19 # 实例的增删改查
    20 
    21 # 查看
    22 print(p1.name)
    23 print(p1.play_ball)  # <bound method People.play_ball of <__main__.People object at 0x000001F04B708198>> 
    24 # 从这里看出来其实 实例本身没有函数属性,它是调用的类的函数属性
    25 
    26 # 增加
    27 p1.age = 18
    28 print(p1.__dict__)
    29 
    30 
    31 def test(self):
    32     print("我是实例的函数属性", self)
    33 
    34 
    35 p1.test_ball = test
    36 print(p1.__dict__)
    37 p1.test_ball(p1)   # 这里必须加上p1参数 
    38 # 因为类只有实例的时候才传入self参数,不传入就会报错  但是没什么卵用 基本没这么玩啊
    39 
    40 # 修改
    41 p1.age = 19
    42 print(p1.__dict__)
    43 
    44 # 删除
    45 del p1.age
    46 print(p1.__dict__)

    七、静态属性、类方法、静态方法

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 
     5 class Room:
     6     tag = 1
     7 
     8     def __init__(self, owner, name, length, width, height):
     9         self.owner = owner
    10         self.name = name
    11         self.length = length
    12         self.width = width
    13         self.height = height
    14 
    15     @property  # 静态属性  外部不能分辨出调用的是函数属性或数据属性
    16     def cal_area(self):
    17         return self.length * self.width
    18 
    19     @classmethod  # 类调用自己的方法   类能访问类的数据属性和类的函数属性
    20     def tell_info(cls, x):
    21         print(cls)
    22         print("--->", cls.tag, x)
    23 
    24     @staticmethod  # 静态方法  是类的工具包 类和实例都可以调用
    25     def wash_body():
    26         print('正在洗澡澡')
    27 
    28     # def test(x, y):
    29     #     print(x, y)   不加@staticmethod实例不能调用啊,没有self,这么定义毫无意义,就是一个一般的函数
    30 
    31 
    32 # 静态属性
    33 r1 = Room("eric", '厕所', 5, 6, 8)
    34 Room.wash_body()
    35 r1.wash_body()
    36 
    37 # 类方法
    38 print(Room.tag)
    39 Room.tell_info(10)
    40 
    41 # 静态属性
    42 r1 = Room("eric", '厕所', 5, 6, 8)
    43 r2 = Room("藏獒", '厕所', 4, 5, 8)
    44 print(r1.cal_area)
    45 print(r2.cal_area)
    46 # 看起来都是调用的数据属性 其实上边是调用的类的函数属性  下面才是调用的数据属性
    47 print(r1.name)
    48 print(r2.owner)

    八、继承以及继承顺序

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import abc
     4 
     5 # 继承:继承一些祖先留下来的东西  接口继承尤其重要
     6 # 派生:就是衍生出新的东西
     7 # 类之间有相同的功能提取出来作为基类
     8 
     9 
    10 class All_file(metaclass=abc.ABCMeta):
    11 
    12     @abc.abstractmethod
    13     def read(self):
    14         pass
    15 
    16     @abc.abstractmethod
    17     def write(self):
    18         pass
    19 
    20 
    21 class Disk(All_file):
    22 
    23     def read(self):
    24         print('disk read')
    25 
    26     def write(self):
    27         print('disk write')
    28 
    29 
    30 class Cdrom(All_file):
    31     def read(self):
    32         print('cdrom read')
    33 
    34     def write(self):
    35         print('cdrom write')
    36 
    37 
    38 d1 = Disk()
    39 d1.read()
    40 
    41 
    42 # 深度优先:最左边优先 就是一条线走通找不到,回来再找别的路线
    43 # 广度优先:最左边优先 就是一条路一直走(不包括最上面的一层),走到最后一层又回来找别的

    九、子类调用父类的方法

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 
     5 class Vehicle:
     6     def __init__(self, name, speed, load, power):
     7         self.name = name
     8         self.speed = speed
     9         self.load = load
    10         self.power = power
    11 
    12     def run(self):
    13         print('开动啦.......')
    14 
    15 
    16 class Subway(Vehicle):
    17     """
    18     super() -> same as super(__class__, <first argument>)
    19     super(type) -> unbound super object
    20     super(type, obj) -> bound super object; requires isinstance(obj, type)
    21     super(type, type2) -> bound super object; requires issubclass(type2, type)
    22     """
    23     def __init__(self, name, speed, load, power, line):
    24         # Vehicle.__init__(self, name, speed, load, power)
    25         # super(Subway, self).__init__(name, speed, load, power)
    26         super().__init__(name, speed, load, power)
    27         self.line = line
    28 
    29     def run(self):
    30         # Vehicle.run(self)
    31         super().run()
    32         print('%s %s号线,开动啦........'%(self.name, self.line))
    33 
    34 
    35 line1 = Subway('成都地铁', '350m/s', 100000000000, '', 1)
    36 print(dir(Subway))
    37 print(line1.__class__)  # <class '__main__.Subway'>
    38 line1.run()

    十、多态

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 
     5 # 工厂就是面向对象中的类
     6 
     7 # 工厂函数
     8 str1 = str('sss')
     9 print(str1)
    10 l = list('abc')  # list类加括号实例化
    11 print(l)
    12 
    13 print(len(l))  # 本质上就是调用print(l.__len__()) Python本身就是多态
    14 
    15 
    16 # 多态:就是多个对象调用父类的相同的方法但结果不一样  强调的是执行相同的功能的时候 多态就是继承的一种表现形式
    17 
    18 
    19 class H2O:
    20     def __init__(self, name, t):
    21         self.name = name
    22         self.t = t
    23 
    24     def turn_ice(self):
    25         if self.t < 0:
    26             print('【%s】温度太低结成冰' % self.name)
    27         elif self.t > 0 and self.t < 100:
    28             print('【%s】液化变成水了' % self.name)
    29         elif self.t > 100:
    30             print('【%s】气化变成水蒸汽了' % self.name)
    31 
    32 
    33 class Water(H2O):
    34     pass
    35 
    36 
    37 class Ice(H2O):
    38     pass
    39 
    40 
    41 class Steam(H2O):
    42     pass
    43 
    44 
    45 w1 = Water('', 25)
    46 i1 = Ice('', -10)
    47 s = Steam('蒸汽', 120)
    48 w1.turn_ice()
    49 i1.turn_ice()
    50 s.turn_ice()

    十一、封装 更新中

    1.封就是把数据隐藏起来
    2.类定义私有的 只在类的内部使用无法访问 这是一种Python约定并不是真正的无法访问
    3.真正的封装是:明确区分内外

     1 class People:
     2     # __star = 'earth'
     3     _star = 'earth'
     4     # star = 'earth'
     5 
     6     def __init__(self, id, name, age, salary):
     7         # print('----->', self.__star)  # 内部使用
     8         self.id = id
     9         self.name = name
    10         self.age = age
    11         self.salary = salary
    12 
    13     def get_id(self):
    14         print('这是获取id的函数')
    15 
    16 
    17 p1 = People('1', 'eric', 18, 10000)
    18 # print(p1.star)
    19 # print(p1._star)
    20 # print(p1.__star)   # 报错 说没有这属性  外部不能使用
    21 # print(People.__dict__)
    22 # print(p1._People__star)  # 外部这样使用
    1 from encapsulation import People
    2 # test.py文件
    3 p1 = People('1', 'eric', 18, 10000)
    4 print(p1._star)
  • 相关阅读:
    Linux系统调用
    Linux的中断 & 中断和异常的区别
    system v和posix的共享内存对比 & 共享内存位置
    epoll里面mmap释疑
    提高网络效率的总结
    推荐相关学习 & 典型算法、典型特征、典型推荐系统框架
    最大似然法理解
    调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令
    内存屏障 & Memory barrier
    锁相关知识 & mutex怎么实现的 & spinlock怎么用的 & 怎样避免死锁 & 内核同步机制 & 读写锁
  • 原文地址:https://www.cnblogs.com/Alexephor/p/11210490.html
Copyright © 2011-2022 走看看