Python基础-类与对象
类的基本使用
class Person():
def __init__(self,name,age):
self.name = name
self.age = age def info(self):
print(f'大家好,我是{self.name},我今年{self.age}岁了') xiaohua = Person('小花',21)
xiaohua.info()
打印结果:
大家好,我是小花,我今年21岁了
python里面的类,架子大概就是这个样子,__init__就是构造函数,所有的方法的第一个形参都是self,这个不是关键字,命名为self是行业默认写法,你把self改成abc也行,重点是第一个形参,进来的都是当前实例对象,对标其他编程语言的this。
属性的存取
正常存取
python里面没有私有属性这个东西,默认全部都是public
class Person():
def __init__(self,name,age):
self.name = name
self.age = age def info(self):
print(f'大家好,我是{self.name},我今年{self.age}岁了') xiaohua = Person('小花',21)
print(f'年龄是:{xiaohua.age}')
xiaohua.age = 22
print(f'改变后的年龄是:{xiaohua.age}')
打印结果:
年龄是:21
改变后的年龄是:22
存取器
python的存取器实际上是用了小花招,它允许你定义属性或者方法的名字前面加上两个下划线,它会对这种格式的名称进行转换,转换后名称也就变了,外部就访问不到该属性,所以就有了私有属性的效果。
class Person():
def __init__(self,name,age):
self.__name = name
self.__age = age def info(self):
print(f'大家好,我是{self.__name},我今年{self.__age}岁了') xiaohua = Person('小花',21)
xiaohua.info()
print(f'年龄是:{xiaohua.__age}')
xiaohua.info()这一行是可以正常打印出信息,但是下面一行就会报错,报错原因是没有__age这个属性。
我们鉴于这种玩法,就可以做出存取器方法
class Person():
def __init__(self,name,age):
self.__name = name
self.__age = age def info(self):
print(f'大家好,我是{self.__name},我今年{self.__age}岁了') def get_age(self):
return self.__age def set_age(self,age):
self.__age = age xiaohua = Person('小花',21)
xiaohua.info()
xiaohua.set_age(23)
xiaohua.info()
打印结果:
大家好,我是小花,我今年21岁了
大家好,我是小花,我今年23岁了
但是事实上,私有属性只能成为一种程序员之间的约定,它是拦不住人的,因为python把带两个下划线打头的属性转换后的结果是有规则的,它会转换成一个下划线+类名+原属性名。
class Person():
def __init__(self,name,age):
self.__name = name
self.__age = age def info(self):
print(f'大家好,我是{self.__name},我今年{self.__age}岁了') def get_age(self):
return self.__age def set_age(self,age):
self.__age = age xiaohua = Person('小花',21)
xiaohua.info()
xiaohua._Person__age = 22
xiaohua.info()
打印结果:
大家好,我是小花,我今年21岁了
大家好,我是小花,我今年22岁了
特性
在新版的python3中,提供了property函数,可以关联到存取方法,实际上它是一个类,只不过我们用起来是函数的用法。
class Person():
def __init__(self,name,age):
self.__name = name
self.__age = age def info(self):
print(f'大家好,我是{self.__name},我今年{self.__age}岁了') def get_age(self):
print(f'这是类里面-我正在读取age的值:{self.__age}')
return self.__age def set_age(self,age):
print(f'这是类里面-我正在设置age的值:{age}')
self.__age = age def del_age(self):
print(f'这是类里面-我正在删除age:{self.__age}')
del self.__age age = property(get_age,set_age,del_age) xiaohua = Person('小花',21)
xiaohua.info()
xiaohua.age = 18
xiaohua.info()
print(f'我在外面读取age的值:{xiaohua.age}')
del xiaohua.age
打印结果:
大家好,我是小花,我今年21岁了
这是类里面-我正在设置age的值:18
大家好,我是小花,我今年18岁了
这是类里面-我正在读取age的值:18
我在外面读取age的值:18
这是类里面-我正在删除age:18
示例中property传入了三个参数,顺序分别是读取方法,设置方法,删除方法,如果都不传,那么该特性将不可读也不可写,传了哪个方法就拥有哪个功能,有第四个可选参数,传入一个文档字符串。
property也可以当成装饰器用
class Person():
def __init__(self,name,age):
self.__name = name
self.__age = age def info(self):
print(f'大家好,我是{self.__name},我今年{self.__age}岁了') @property
def age(self):
print(f'这是类里面-我正在读取age的值:{self.__age}')
return self.__age @age.setter
def age(self,age):
print(f'这是类里面-我正在设置age的值:{age}')
self.__age = age xiaohua = Person('小花',21)
xiaohua.info()
xiaohua.age = 18
xiaohua.info()
print(f'我在外面读取age的值:{xiaohua.age}')
打印结果:
大家好,我是小花,我今年21岁了
这是类里面-我正在设置age的值:18
大家好,我是小花,我今年18岁了
这是类里面-我正在读取age的值:18
我在外面读取age的值:18
继承
常规继承
继承的写法是在类定义的时候类名后面的括号里传入父类名称
class Person():
def info(self):
print('人类正在统治世界') class student(Person):
def __init__(self):
print('我是一名小学生') p = student()
p.info()
打印结果:
我是一名小学生
人类正在统治世界
访问父类方法
在python中访问父类方法用一个特殊的函数 : super()
class Person():
def info(self):
print('人类正在统治世界') class student(Person):
def __init__(self):
super().info()
print('我是一名小学生') p = student()
打印结果:
人类正在统治世界
我是一名小学生
如果是初始化类的时候要调用父类的构造函数,也是一样的调用方式:
class Person():
def __init__(self,name):
self.__name = name def info(self):
print(f'人类正在统治世界:{self.__name}') class student(Person):
def __init__(self,name):
super().__init__(name) p = student('阿西吧')
p.info()
打印结果:
人类正在统治世界:阿西吧
方法重写
子类将父类的方法进行重写覆盖
class Person():
def info(self):
print('人类正在统治世界') class student(Person):
def info(self):
print('小学生正在统治世界') p = student()
p.info()
打印结果:
小学生正在统治世界
多重继承
多重继承虽然很强大,也很容易成为车祸现场,多个父类中如果有构造函数如果有同名方法都将搞得你头晕脑胀,正常情况下,应该避免使用多重继承,除非忍不住。。。
class Person():
def info(self):
print('人类正在统治世界') class Young():
def young_info(self):
print('年轻人太天真') class student(Person,Young):
def __init__(self):
print('小学生正在统治世界') p = student()
p.info()
p.young_info()
打印结果:
小学生正在统治世界
人类正在统治世界
年轻人太天真
类型校验
class Person():
def info(self):
print('人类正在统治世界') class Young():
def young_info(self):
print('年轻人太天真') class student(Person,Young):
def __init__(self):
print('小学生正在统治世界') a = issubclass(student,Person)
print(f'是不是子类:{a}') x = student.__bases__
print(f'父类是:{x}') s = student()
z = isinstance(s,student)
print(f'是不是实例:{z}')
打印结果:
是不是子类:True
父类是:(<class '__main__.Person'>, <class '__main__.Young'>)
小学生正在统治世界
是不是实例:True
是不是实例判断 如果和父类进行判断也算是实例。
抽象接口
面向接口编程的时候都是先定义接口,然后子类去实现接口实现方法,在python3中引入了abc模块,可以帮助我们定义抽象接口
import abc class Person(metaclass=abc.ABCMeta): @abc.abstractmethod
def eat(self):
pass class student(Person): def eat(self):
print('小学生也可以吃饭') x = student()
x.eat()
打印结果:
小学生也可以吃饭
抽象类中定义的接口在子类中必须实现
静态方法
class student(): remark = '我是祖国的花朵' @classmethod
def sing(cls):
print('小学生也可以唱歌 ' + cls.remark) @staticmethod
def eat():
print('小学生也可以吃饭') student.eat()
student.sing()
打印结果:
小学生也可以吃饭
小学生也可以唱歌 我是祖国的花朵
两种装饰器可以定义静态方法,注意区别,@classmethod装饰的方法有默认参数cls,表示当前类,可以取到属性。
Python基础-类与对象的更多相关文章
- <Python基础>类和对象(初级)---烧开水的例子
''' 类:模板(模子) 类的名称:类名(人) 类的属性:一组数据(年龄,身高) 类的方法:进行操作的方法(走,跑,吃,喝) 对象:实体 类的抽象:把现实中的物品用类去表示 ''' #创建一个类 cl ...
- python基础——类名称空间与对象(实例)名称空间
python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...
- python基础——类和实例
python基础——类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都 ...
- Python基础-类
Python基础-类 @(Python)[python, python基础] 写在前面 如非特别说明,下文均基于Python3 摘要 本文重点讲述如何创建和使用Python类,绑定方法与非绑定方法的区 ...
- 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- 第31节:Java基础-类与对象
前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载 ...
- python的类和对象2(self参数)
python的类和对象2(self参数) 1.python里面对象的方法都会有self参数,它就相当于C++里面的this指针:绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在 ...
- Python初识类与对象
Python初识类与对象 类与对象 世界观角度分析类与对象 类是一个抽象的概念,而对象是一个实体的存在,对象由类创造而出,每个对象之间互相独立互不影响,一个对象可以同时拥有多个类的方法,实例化就是通过 ...
- python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)
python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...
随机推荐
- SUBSTRING / CHARINDEX_函数随手练_2
SUBSTRING / CHARINDEX_函数随手练_2环境:MSSQL 2014(AdventureWorks2008R2附加到2014中的表 Location) /* Learning SQL ...
- c printf(“%d”,变量)函数
- 小白的mapbox学习之路-显示地图
刚接触mapbox,只是简单记下自己的学习之路,如有错误,欢迎大神指正 1-头部引入链接 2-body中定义一个div块,用来显示地图 3-在script中创建一个map对象,并设置相关参数 mapb ...
- 基于node的前端项目编译时内存溢出问题
解决方法: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory JavaScript堆内存不足,这里说的 Jav ...
- 找到了两个联想的OEM XP镜像文件
今天在收拾移动硬盘的时候发现了两个XP镜像 还都是联想的,一个有OOBE,另一个无OOBE,全传网盘里了,需要的自取 有个疑问 2020年还有多少家庭电脑和ATM机器还在用XP??? link:htt ...
- selenium(5)-解读强制等待,隐式等待,显式等待的区别
背景 为什么要设置元素等待 因为,目前大多数Web应用程序都是使用Ajax和Javascript开发的:每次加载一个网页,就会加载各种HTML标签.JS文件 但是,加载肯定有加载顺序,大型网站很难说一 ...
- WeChair项目Beta冲刺(4/10)
团队项目进行情况 1.昨日进展 Beta冲刺第四天 昨日进展: 前后端并行开发,项目按照计划有条不絮进行 2.今日安排 前端:扫码占座功能和预约功能并行开发 后端:扫码占座后端逻辑和预约功能逻辑 ...
- 多语言工作者の十日冲刺<7/10>
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--第七天(05.06) 作业正文 ...
- 说说TCP的三次握手和四次挥手
一.传输控制协议TCP简介 1.1 简介 TCP(Transmission Control Protocol) 传输控制协议,是一种 面向连接的.可靠的.基于字节流的传输层 通信协议. TCP是一种面 ...
- .NETCore微服务探寻(二) - 认证与授权
前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...