大话Python类语义
类
物以类聚,人以群分,就是相同特征的人和事物会自动聚集在一起,核心驱动点就是具有相同特征或相类似的特征,我们把具有相同特征或相似特征的事物放在一起,被称为分类,把分类依据的特征称为类属性
计算机中分类的思想叫做面向对象,Python中把数据抽象成对象,通过对象或对象间的关系来描叙数据。
我们把一些相似事物的共同特征通过一个方式描叙出来,也就是说,你是按什么标准对事物进行分类,相似点是什么,计算机把对相似事物的特征数据进行描叙称为类定义
计算机中类的三大特征
1. 封装 对数据的可见性进行约束,分为公有public、私有private、非公有, 公有数据可以直接通过属性访问语法 obj.attr 直接访问,但是私有、非公有则通过方法进行访问,访问行为其实就是SQL中的增删改查,查称为读,增删改称为写,在Python中类的数据称为数据属性,类中定义的函数称为方法,方法是关联对象的函数
class Person:
"""数据封装实现"""
def __init__(self, name, age, sex):
"""名字是公开的, 性别是非公有, 年龄是私有"""
# 现在给实例插入数据
# 公有数据
self.name = name
# 非公有使用一个下划线
self._sex = sex
# 私有变量使用两个下划线
self.__age = age def get_name(self):
"""通过方法读取名称"""
return self.name def set_age(self, value):
"""对年龄进行修改"""
self.__age == value def get_age(self):
"""通过方法获取私有属性年龄"""
return self.__age if __name__ == '__main__':
# 类的实例话类似函数调用,也可以使用关键字参数和位置参数
p = Person("北门吹雪", 20, "male")
# 通过 obj.name 属性访问语言访问实例的属性,这个饭方法只能访问公有属性
print(p.name) # 通过方法修改年龄
p.set_age(22)
# 通过方法访问私有属性
print(p.get_age())
pass
2. 继承 需要理清几个概念,父类、子类、基类、派生类,父类就是基类,子类就是派生类。继承是建立在类的基础上,子类完全继承父类的所有属性以及控制属性访问的方法。继承要理清差异共相同点,对依据对事物进行分类的特征要非常确定才能写计算机中的类,不然不是分类,分类的前提是公共特征,继承的前提是共性与差异,如果不理解共同特征你就无法分类,你不理解同一类的共性与差异你无法写出继承,继承强调的是公共特征,包括属性和方法
class Human(object):
"""定义人类, 每个人类都有名字和国家, 都会说话"""
def __init__(self, name, country):
self.name = name
self.country = country def say(self, language):
"""交流说话"""
print(f"{self.name} 能说 {language}") class Chinese(Human):
"""定义一个中国人,继承人类 Human被称为这个类的基类或这个类的父类,Chinese被成为Human的派生类""" def __init__(self, name, country, skin):
"""中国人和外国人最大的不同是肤色"""
# 调用父类的构造函数
super(Chinese, self).__init__(name, country)
self.skin = skin if __name__ == '__main__':
c = Chinese("北门吹雪", 20, "yellow")
print(c.skin)
c.say("中文")
pass
3. 多态 同一个行为具有不同表现形式或形态的能力,计算机中最接近多态的是接口interface,接口定义相同行为,然后我们对接口行为的分类,就产生所谓的抽象基类,通过继承机制,然后子类重写方法从而实现多态,说白了就是同一个方法中有不同的实现,再说漏骨一点就是函数的名称相同,函数的形参相同,函数的返回值相同,但是函数体内的语句逻辑不一样,这个函数体不同被称为多态。多态是建立在继承的基础上然后对方法进行重写,其实能重写(又称为重载)的只有函数体,多态强调的是方法
class HumanInterface(object):
"""定义一个人类的抽象接口,用于实现多态, 多态强调的是方法 定义了两个接口,一个是吃 一个是说
"""
def say(self, language):
"""说"""
pass def eat(self, what):
"""吃"""
pass class Chinese(HumanInterface):
"""定义一个中国人,继承人类""" def __init__(self, name, country):
"""中国人和外国人最大的不同是肤色"""
# 调用父类的构造函数
self.name = name
self.country = country def eat(self, what):
"""重载或重写 父类中的方法,实现多态"""
print(f"{self.name} 正在吃{what}ing")
pass def say(self, language):
print(f"{self.name} 能说 {language}")
pass class American(HumanInterface):
"""美国人"""
def __init__(self, name, country):
"""中国人和外国人最大的不同是肤色"""
# 调用父类的构造函数
self.name = name
self.country = country def eat(self, what):
"""重载或重写 父类中的方法,实现多态"""
print(f"{self.name}吃{what}再跳舞")
pass def say(self, language):
print(f"{self.name} 不仅能说 {language}, 还会其他国家语言")
pass if __name__ == '__main__':
c = Chinese("北门吹雪", "中国")
a = American("alex", "美国")
c.eat("大米")
a.eat("汉堡包") c.say("中文")
a.say("英语")
# 你会发现他们方法名相同,但是输出不同,也就是形态不同
Python中类定义
类定义
class Name:
pass
# 定义是可执行的语句,在被import语句导入或以main文件执行时,定义就会被执行
# 类定义的执行,首先会在当前作用域引入一个用于存储类中属性的命名空间。然后把这个类命名空间封装成对象返回,并把这个类对象绑定到class关键字指定的名称,这个名称又被绑定到class关键子所在的命名空间
# Name -> 类对象 > 类命名空间
# 其实类定义中包含的一般是函数定义,函数定义的第一个参数其实时实例本身,通过实例本身就可以访问实例中的数据属性和方法
类对象
# 支持两种操作:属性引用 和 实例化
# 属性引用使用Python标准属性引用语法 obj.name
# 实例化: 类的实例化,类似于函数调用,把括号里的参数传递给类的__init__方法,通过__init__方法为类的新实例初始化特定的属性,这个init方法又被称为工厂函数, 其他语言中的类通过new关键字创建。Python中通过函数调用传参的形式实现类的实例化
class Person(object):
"""人类"""
# 能说话
can_say = True
# 能吃
can_eat = True
# 能睡觉
can_sleep = True def __init__(self, name, age, country):
self.name = name
self.__age = age
self.country = country def show_country(self):
"""显示国籍"""
print(f"{self.name}的国籍是: {self.country}") if __name__ == '__main__':
# 属性引用
print(Person.can_eat)
print(Person.can_sleep)
print(Person.can_sleep) # 实例化
c = Person("北门吹雪", 20, "中国")
实例对象
# 支持唯一的操作就是属性引用, 其实和普通的变量引用一样,只是多个归属前缀而已,通过方法对实例里的变量进行修改,实际上在函数封装过程的基础上再把数据和函数绑定起来
class Person(object):
"""人类"""
# 能说话
can_say = True
# 能吃
can_eat = True
# 能睡觉
can_sleep = True def __init__(self, name, age, country):
self.name = name
self.__age = age
self.country = country def show_country(self):
"""显示国籍"""
print(f"{self.name}的国籍是: {self.country}") def set_age(self, value):
"""修改年龄"""
self.__age = value def get_age(self):
"""获取年龄"""
return self.__age if __name__ == '__main__':
# 实例化
user = Person("北门吹雪", 20, "中国")
# 属性引用
user_age = user.get_age()
print(user_age) # 设置年龄
user.set_age(22)
print(user.get_age())
方法对象
# 方法是从属某个对象的函数,类中的函数定义了类的实例所拥有的方法,也就是说对象的类型决定了对象支持的操作
# 方法对比函数,函数定义在模块或函数中,方法定义在类定义中,方法的第一个参数固定时实例对象
类和实例变量
# 实例变量是每个实例的唯一数据,而类变量是该类的所有实例共享的属性和方法
# 相同属性名称出现在类和实例中,首先被找到的时实例属性
class Person(object):
"""人类"""
# 该类被实例化多少次
object_count = 0 # 默认全球通用语言是英语
language = "En" def __init__(self, name, age, country, language):
self.name = name
self.__age = age
self.country = country
self.language = language def show_country(self):
"""显示国籍"""
print(f"{self.name}的国籍是: {self.country}") def set_age(self, value):
"""修改年龄"""
self.__age = value def get_age(self):
"""获取年龄"""
return self.__age @classmethod
def add_obj(cls):
cls.object_count += 1 if __name__ == '__main__':
# 实例化
user = Person("北门吹雪", 20, "中国", "Cn")
# 实例化一次则类变量增加一次
Person.add_obj() user_two = Person("alex", 30, "美国", "En")
Person.add_obj() # 打印被实例化几次
print(Person.object_count) # 类变量和属性同名访问,优先选择实例
print(user.language)
大话Python类语义的更多相关文章
- Python类中super()和__init__()的关系
Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...
- LightMysql:为方便操作MySQL而封装的Python类
原文链接:http://www.danfengcao.info/python/2015/12/26/lightweight-python-mysql-class.html mysqldb是Python ...
- python 类属性与方法
Python 类属性与方法 标签(空格分隔): Python Python的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...
- python 类以及单例模式
python 也有面向对象的思想,则一切皆对象 python 中定义一个类: class student: count = 0 books = [] def __init__(self ...
- Python类的特点 (1):构造函数与方法
Python中,类的特点: #encoding:utf-8 class Parent(object): x=1 #x是Parent类的属性(字段) def __init__(self): print ...
- Python类属性,实例属性
1.Python类数据属性:定义在类里面但在函数外面的变量,它们都是静态的. #一段很简单的代码,但反应了很多 >>> class A(): a=1 #一个类里面有个属性a > ...
- python类及其方法
python类及其方法 一.介绍 在 Python 中,面向对象编程主要有两个主题,就是类和类实例类与实例:类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中 ...
- python类的定义和使用
python中类的声明使用关键词class,可以提供一个可选的父类或者说基类,如果没有合适的基类,那就用object作为基类. 定义格式: class 类名(object): "类的说明文档 ...
- Python类的探讨
我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法 Python类定义以关键字class开头,一个类定义例 ...
随机推荐
- 没想到吧!关于Dubbo的『消费端线程池模型』官网也写错了。
这是why的第 63 篇原创文章 荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 63 篇.老规矩,先荒腔走板聊聊其他的. 上面这张图片是我前几天整理相册的时候看到的.拍摄于 20 ...
- windows快速安装linux虚拟机
1. 场景描述 因测试中需要linux集群,目前的服务器不太方便部署,需要本机(windows7)启动多个linux虚拟机,记录下,希望能帮到需要的朋友. 2. 解决方案 2.1 软件准备 (1)使用 ...
- vue 中使用echarts
前言:在vue2.0中使用百度echarts有三种解决方案. 一.原始方法直接使用 这样每次都要获取图表dom元素 然后通过setOption渲染数据,最后在mounted中初始化.很麻烦. < ...
- [源码解析] Flink的Slot究竟是什么?(2)
[源码解析] Flink 的slot究竟是什么?(2) 目录 [源码解析] Flink 的slot究竟是什么?(2) 0x00 摘要 0x01 前文回顾 0x02 注册/更新Slot 2.1 Task ...
- spring自带的MD5加密工具类
Spring 自带的md5加密工具类,本来打算自己找一个工具类的,后来想起来Spring有自带的,就翻了翻 //导入包import org.springframework.util.DigestUti ...
- 深入理解 JVM 的内存区域
深入理解运行时数据区 代码示例: 1. JVM 向操作系统申请内存: JVM 第一步就是通过配置参数或者默认配置参数向操作系统申请内存空间,根据内存大小找到具体的内存分配表,然后把内存段的起始地址和终 ...
- 深入理解 vue 中 scoped 样式作用域的规则
哈喽!大家好!我是木瓜太香,今天我们来聊一个 vue 的样式作用域的问题,通常我们开发项目的时候是要在 style 上加上 scoped 来起到规定组件作用域的效果的,所以了解他们的规则也是很有必要的 ...
- Oracle数据库之表与表数据操作
一.SQL语言 SQL语言分为四种,分别是:数据定义语言(DDL).数据操纵语言(DCL).事务控制语言(TCL).数据控制语言(DML). 1.1 数据定义语言(DDL) 建立.修改.删除数据库对象 ...
- Python算法题:有100只大、中、小骆驼,100框土豆,一只大骆驼可以背3框,中骆驼可以背俩框,小骆驼两只背一筐,问大中小各有多少只骆驼?
1 for x in range(0,100): 2 for y in range(0,100): 3 for z in range(0, 100): 4 if x*3+y*2+0.5*z == 10 ...
- 设计模式也可以这么简单(7年开发老鸟PS注释总结)
设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结,其中最出名的当属 Gang of Four (GoF) 的分类了,他们将设计模式分类为 23 种经典的模式,根据用途我们又可以分为三大类,分 ...