物以类聚,人以群分,就是相同特征的人和事物会自动聚集在一起,核心驱动点就是具有相同特征或相类似的特征,我们把具有相同特征或相似特征的事物放在一起,被称为分类,把分类依据的特征称为类属性

  计算机中分类的思想叫做面向对象,Python中把数据抽象成对象,通过对象或对象间的关系来描叙数据。

  我们把一些相似事物的共同特征通过一个方式描叙出来,也就是说,你是按什么标准对事物进行分类,相似点是什么,计算机把对相似事物的特征数据进行描叙称为类定义

计算机中类的三大特征
  1. 封装数据的可见性进行约束,分为公有public、私有private、非公有, 公有数据可以直接通过属性访问语法 obj.attr 直接访问,但是私有、非公有则通过方法进行访问,访问行为其实就是SQL中的增删改查,查称为读,增删改称为写,在Python中类的数据称为数据属性,类中定义的函数称为方法,方法是关联对象的函数

  1. class Person:
  2. """数据封装实现"""
  3. def __init__(self, name, age, sex):
  4. """名字是公开的, 性别是非公有, 年龄是私有"""
  5. # 现在给实例插入数据
  6. # 公有数据
  7. self.name = name
  8. # 非公有使用一个下划线
  9. self._sex = sex
  10. # 私有变量使用两个下划线
  11. self.__age = age
  12.  
  13. def get_name(self):
  14. """通过方法读取名称"""
  15. return self.name
  16.  
  17. def set_age(self, value):
  18. """对年龄进行修改"""
  19. self.__age == value
  20.  
  21. def get_age(self):
  22. """通过方法获取私有属性年龄"""
  23. return self.__age
  24.  
  25. if __name__ == '__main__':
  26. # 类的实例话类似函数调用,也可以使用关键字参数和位置参数
  27. p = Person("北门吹雪", 20, "male")
  28. # 通过 obj.name 属性访问语言访问实例的属性,这个饭方法只能访问公有属性
  29. print(p.name)
  30.  
  31. # 通过方法修改年龄
  32. p.set_age(22)
  33. # 通过方法访问私有属性
  34. print(p.get_age())
  35. pass

  2. 继承 需要理清几个概念,父类、子类、基类、派生类,父类就是基类,子类就是派生类。继承是建立在类的基础上,子类完全继承父类的所有属性以及控制属性访问的方法。继承要理清差异共相同点,对依据对事物进行分类的特征要非常确定才能写计算机中的类,不然不是分类,分类的前提是公共特征,继承的前提是共性与差异,如果不理解共同特征你就无法分类,你不理解同一类的共性与差异你无法写出继承,继承强调的是公共特征,包括属性和方法

  1. class Human(object):
  2. """定义人类, 每个人类都有名字和国家, 都会说话"""
  3. def __init__(self, name, country):
  4. self.name = name
  5. self.country = country
  6.  
  7. def say(self, language):
  8. """交流说话"""
  9. print(f"{self.name} 能说 {language}")
  10.  
  11. class Chinese(Human):
  12. """定义一个中国人,继承人类
  13.  
  14. Human被称为这个类的基类或这个类的父类,Chinese被成为Human的派生类"""
  15.  
  16. def __init__(self, name, country, skin):
  17. """中国人和外国人最大的不同是肤色"""
  18. # 调用父类的构造函数
  19. super(Chinese, self).__init__(name, country)
  20. self.skin = skin
  21.  
  22. if __name__ == '__main__':
  23. c = Chinese("北门吹雪", 20, "yellow")
  24. print(c.skin)
  25. c.say("中文")
  26. pass

   3. 多态 同一个行为具有不同表现形式或形态的能力,计算机中最接近多态的是接口interface,接口定义相同行为,然后我们对接口行为的分类,就产生所谓的抽象基类,通过继承机制,然后子类重写方法从而实现多态,说白了就是同一个方法中有不同的实现,再说漏骨一点就是函数的名称相同,函数的形参相同,函数的返回值相同,但是函数体内的语句逻辑不一样,这个函数体不同被称为多态。多态是建立在继承的基础上然后对方法进行重写,其实能重写(又称为重载)的只有函数体,多态强调的是方法

  1. class HumanInterface(object):
  2. """定义一个人类的抽象接口,用于实现多态, 多态强调的是方法
  3.  
  4. 定义了两个接口,一个是吃 一个是说
  5. """
  6. def say(self, language):
  7. """说"""
  8. pass
  9.  
  10. def eat(self, what):
  11. """吃"""
  12. pass
  13.  
  14. class Chinese(HumanInterface):
  15. """定义一个中国人,继承人类"""
  16.  
  17. def __init__(self, name, country):
  18. """中国人和外国人最大的不同是肤色"""
  19. # 调用父类的构造函数
  20. self.name = name
  21. self.country = country
  22.  
  23. def eat(self, what):
  24. """重载或重写 父类中的方法,实现多态"""
  25. print(f"{self.name} 正在吃{what}ing")
  26. pass
  27.  
  28. def say(self, language):
  29. print(f"{self.name} 能说 {language}")
  30. pass
  31.  
  32. class American(HumanInterface):
  33. """美国人"""
  34. def __init__(self, name, country):
  35. """中国人和外国人最大的不同是肤色"""
  36. # 调用父类的构造函数
  37. self.name = name
  38. self.country = country
  39.  
  40. def eat(self, what):
  41. """重载或重写 父类中的方法,实现多态"""
  42. print(f"{self.name}吃{what}再跳舞")
  43. pass
  44.  
  45. def say(self, language):
  46. print(f"{self.name} 不仅能说 {language}, 还会其他国家语言")
  47. pass
  48.  
  49. if __name__ == '__main__':
  50. c = Chinese("北门吹雪", "中国")
  51. a = American("alex", "美国")
  52. c.eat("大米")
  53. a.eat("汉堡包")
  54.  
  55. c.say("中文")
  56. a.say("英语")
  57. # 你会发现他们方法名相同,但是输出不同,也就是形态不同

Python中类定义
类定义

  1. class Name:
  2. pass

  # 定义是可执行的语句,在被import语句导入或以main文件执行时,定义就会被执行
  # 类定义的执行,首先会在当前作用域引入一个用于存储类中属性的命名空间。然后把这个类命名空间封装成对象返回,并把这个类对象绑定到class关键字指定的名称,这个名称又被绑定到class关键子所在的命名空间
  # Name -> 类对象 > 类命名空间
  # 其实类定义中包含的一般是函数定义,函数定义的第一个参数其实时实例本身,通过实例本身就可以访问实例中的数据属性和方法

类对象
  # 支持两种操作:属性引用 和 实例化
  # 属性引用使用Python标准属性引用语法 obj.name
  # 实例化: 类的实例化,类似于函数调用,把括号里的参数传递给类的__init__方法,通过__init__方法为类的新实例初始化特定的属性,这个init方法又被称为工厂函数, 其他语言中的类通过new关键字创建。Python中通过函数调用传参的形式实现类的实例化

  1. class Person(object):
  2. """人类"""
  3. # 能说话
  4. can_say = True
  5. # 能吃
  6. can_eat = True
  7. # 能睡觉
  8. can_sleep = True
  9.  
  10. def __init__(self, name, age, country):
  11. self.name = name
  12. self.__age = age
  13. self.country = country
  14.  
  15. def show_country(self):
  16. """显示国籍"""
  17. print(f"{self.name}的国籍是: {self.country}")
  18.  
  19. if __name__ == '__main__':
  20. # 属性引用
  21. print(Person.can_eat)
  22. print(Person.can_sleep)
  23. print(Person.can_sleep)
  24.  
  25. # 实例化
  26. c = Person("北门吹雪", 20, "中国")

实例对象
  # 支持唯一的操作就是属性引用, 其实和普通的变量引用一样,只是多个归属前缀而已,通过方法对实例里的变量进行修改,实际上在函数封装过程的基础上再把数据和函数绑定起来

  1. class Person(object):
  2. """人类"""
  3. # 能说话
  4. can_say = True
  5. # 能吃
  6. can_eat = True
  7. # 能睡觉
  8. can_sleep = True
  9.  
  10. def __init__(self, name, age, country):
  11. self.name = name
  12. self.__age = age
  13. self.country = country
  14.  
  15. def show_country(self):
  16. """显示国籍"""
  17. print(f"{self.name}的国籍是: {self.country}")
  18.  
  19. def set_age(self, value):
  20. """修改年龄"""
  21. self.__age = value
  22.  
  23. def get_age(self):
  24. """获取年龄"""
  25. return self.__age
  26.  
  27. if __name__ == '__main__':
  28. # 实例化
  29. user = Person("北门吹雪", 20, "中国")
  30. # 属性引用
  31. user_age = user.get_age()
  32. print(user_age)
  33.  
  34. # 设置年龄
  35. user.set_age(22)
  36. print(user.get_age())

方法对象
  # 方法是从属某个对象的函数,类中的函数定义了类的实例所拥有的方法,也就是说对象的类型决定了对象支持的操作
  # 方法对比函数,函数定义在模块或函数中,方法定义在类定义中,方法的第一个参数固定时实例对象

类和实例变量
  # 实例变量是每个实例的唯一数据,而类变量是该类的所有实例共享的属性和方法
  # 相同属性名称出现在类和实例中,首先被找到的时实例属性

  1. class Person(object):
  2. """人类"""
  3. # 该类被实例化多少次
  4. object_count = 0
  5.  
  6. # 默认全球通用语言是英语
  7. language = "En"
  8.  
  9. def __init__(self, name, age, country, language):
  10. self.name = name
  11. self.__age = age
  12. self.country = country
  13. self.language = language
  14.  
  15. def show_country(self):
  16. """显示国籍"""
  17. print(f"{self.name}的国籍是: {self.country}")
  18.  
  19. def set_age(self, value):
  20. """修改年龄"""
  21. self.__age = value
  22.  
  23. def get_age(self):
  24. """获取年龄"""
  25. return self.__age
  26.  
  27. @classmethod
  28. def add_obj(cls):
  29. cls.object_count += 1
  30.  
  31. if __name__ == '__main__':
  32. # 实例化
  33. user = Person("北门吹雪", 20, "中国", "Cn")
  34. # 实例化一次则类变量增加一次
  35. Person.add_obj()
  36.  
  37. user_two = Person("alex", 30, "美国", "En")
  38. Person.add_obj()
  39.  
  40. # 打印被实例化几次
  41. print(Person.object_count)
  42.  
  43. # 类变量和属性同名访问,优先选择实例
  44. print(user.language)

  

大话Python类语义的更多相关文章

  1. Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...

  2. LightMysql:为方便操作MySQL而封装的Python类

    原文链接:http://www.danfengcao.info/python/2015/12/26/lightweight-python-mysql-class.html mysqldb是Python ...

  3. python 类属性与方法

    Python 类属性与方法 标签(空格分隔): Python Python的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...

  4. python 类以及单例模式

    python 也有面向对象的思想,则一切皆对象 python 中定义一个类: class student: count = 0         books = [] def __init__(self ...

  5. Python类的特点 (1):构造函数与方法

    Python中,类的特点: #encoding:utf-8 class Parent(object): x=1 #x是Parent类的属性(字段) def __init__(self): print ...

  6. Python类属性,实例属性

    1.Python类数据属性:定义在类里面但在函数外面的变量,它们都是静态的. #一段很简单的代码,但反应了很多 >>> class A(): a=1 #一个类里面有个属性a > ...

  7. python类及其方法

    python类及其方法 一.介绍 在 Python 中,面向对象编程主要有两个主题,就是类和类实例类与实例:类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中 ...

  8. python类的定义和使用

    python中类的声明使用关键词class,可以提供一个可选的父类或者说基类,如果没有合适的基类,那就用object作为基类. 定义格式: class 类名(object): "类的说明文档 ...

  9. Python类的探讨

    我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法  Python类定义以关键字class开头,一个类定义例 ...

随机推荐

  1. 获取访问的ip地址

    最近有一个这样的需求:{ 内网没有访问互联网的权限(没网) 内网:访问链接地址,跳转http://www.123.com 外网:访问链接地址,跳转http;//www.456.com } 在网上看到一 ...

  2. day44:CSS选择器优先级&JS基础

      目录 1.CSS选择器优先级 2.补充:margin是可以设置百分比的 3.JS 3.1 js代码的引入方式 3.2 变量 3.3 数据类型 3.4 数组(类似于python中的列表) 3.5 自 ...

  3. 挂载磁盘不成功显示mount: /mnt: wrong fs type, bad option, bad superblock..............

    [23:25:32 root@8 ~]#mount /dev/sdb2 /mntmount: /mnt: wrong fs type, bad option, bad superblock on /d ...

  4. 深入了解Netty【一】BIO、NIO、AIO简单介绍

    引言 在Java中提供了三种IO模型:BIO.NIO.AIO,模型的选择决定了程序通信的性能. 1.1.使用场景 BIO BIO适用于连接数比较小的应用,这种IO模型对服务器资源要求比较高. NIO ...

  5. 如何让SpringBoot工程在log/控制台中实时打印MyBatis执行的SQL语句

    工程下载:https://files.cnblogs.com/files/xiandedanteng/gatling20200429-4.zip 其实就是一句话设置的事情,实现步骤: 在applica ...

  6. 20190916-01linux文件与目录结构 000 001

    1./bin 是Binary的缩写,这个目录存放着最经常使用的命令 2./sbin s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序 3./home 存放普通用户的主目录,在 ...

  7. 高可用服务之Keepalived邮件通知配置

    上一篇博客我们了解了keepalived的架构以及安装.VIP的配置和高可用相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13634755.html: ...

  8. JS语法_其他

    严格模式 let obj = { name: 'oceans', } function f1() { with (obj) { console.log(name) } } function f2() ...

  9. 浅谈Java 线程池原理及使用方式

    一.简介 什么是线程池? 池的概念大家也许都有所听闻,池就是相当于一个容器,里面有许许多多的东西你可以即拿即用.java中有线程池.连接池等等.线程池就是在系统启动或者实例化池时创建一些空闲的线程,等 ...

  10. STL(常用)

    STL 简单记录.讲解一些初级阶段常用的用法. STL是C++的一个标准模板库,其中包含了许多在计算机领域常用的基本数据结构以及基本算法.STL主要依赖于模板,使得STL具有广泛的通用性.这篇文章旨在 ...