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)
  • 相关阅读:
    Java实现 LeetCode 242 有效的字母异位词
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 212 单词搜索 II
    Java实现 LeetCode 344 反转字符串
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
    Java实现 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk
  • 原文地址:https://www.cnblogs.com/Alexephor/p/11210490.html
Copyright © 2011-2022 走看看