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面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...
随机推荐
- Spark GraphX企业运用
========== Spark GraphX 概述 ==========1.Spark GraphX是什么? (1)Spark GraphX 是 Spark 的一个模块,主要用于进行以图为核心的计 ...
- Django自定义500的错误显示信息
这个方法应该对Django version 2.2.4以后的版本都有效,因为我的项目是这个版本,其他版本我并没有测试. 首先找到Django的exception.py文件路径: C:\python_ ...
- 1、安装配置Git私有服务器
安装并配置一个私有的Git服务器吧,这样自己的代码就可以进行版本控制了,当然版本控制的重要性嘛,Please Baidu. 系统环境:64位Win10 Version 1909 安装步骤: 1.下载j ...
- APP——python——自动化环境搭建01
前提:python以及pycharm安装完成. ---------------------------------------------------------------------------- ...
- 初识Java Java基础知识
今天给大家带来的是初级Java基础部分的知识:包括初识Java.变量.常量.数据类型.运算符.各种选择结构.循环结构.数组等Java的基础语法部分!!!内容.步骤超详细,附有各种案例的源代码(可以直接 ...
- 全链路监控系统开源Pinpoint入门视频教程(最新版本1.8)
pinpoint支持的模块 源码:https://github.com/naver/pinpoint技术概述:https://skyao.gitbooks.io/learning-pinpoint/c ...
- PHP 多维数组转json对象
PHP 多维数组转json对象 php 数组转json对象,可能大家都知道要用json_encode,但是转换出来的格式多有不同,此处做个小小的记录! 1. 一维数组转json对象 <?php ...
- Vue学习-组件的基本使用(局部组件)
目录 示例代码 1.创建组件(构造器对象创建-Vue.extend) 2.注册组件 3.使用组件 4.语法糖创建并注册组件 示例代码 http://jsrun.net/H8vKp/edit 1.创建组 ...
- 痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列ROM中的FlexSPI驱动API实现IAP. 痞子衡的技术交流群里经常有群友提问: i.MXRT中的FlexSPI驱动 ...
- git和github入门指南(6)
6.交作业的流程 以下内容是螺钉课堂在线就业班提交作业的要求,非螺钉课堂在线就业班学员不用学习 螺钉课堂作业全程采用git管理,希望在日常使用中,加深对git和github的理解 具体流程: 1.注册 ...