类的基本使用

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基础-类与对象的更多相关文章

  1. <Python基础>类和对象(初级)---烧开水的例子

    ''' 类:模板(模子) 类的名称:类名(人) 类的属性:一组数据(年龄,身高) 类的方法:进行操作的方法(走,跑,吃,喝) 对象:实体 类的抽象:把现实中的物品用类去表示 ''' #创建一个类 cl ...

  2. python基础——类名称空间与对象(实例)名称空间

    python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...

  3. python基础——类和实例

    python基础——类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都 ...

  4. Python基础-类

    Python基础-类 @(Python)[python, python基础] 写在前面 如非特别说明,下文均基于Python3 摘要 本文重点讲述如何创建和使用Python类,绑定方法与非绑定方法的区 ...

  5. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  6. 第31节:Java基础-类与对象

    前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载 ...

  7. python的类和对象2(self参数)

    python的类和对象2(self参数) 1.python里面对象的方法都会有self参数,它就相当于C++里面的this指针:绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在 ...

  8. Python初识类与对象

    Python初识类与对象 类与对象 世界观角度分析类与对象 类是一个抽象的概念,而对象是一个实体的存在,对象由类创造而出,每个对象之间互相独立互不影响,一个对象可以同时拥有多个类的方法,实例化就是通过 ...

  9. python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)

    python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...

随机推荐

  1. Spark GraphX企业运用

    ========== Spark GraphX 概述 ==========1.Spark GraphX是什么?  (1)Spark GraphX 是 Spark 的一个模块,主要用于进行以图为核心的计 ...

  2. Django自定义500的错误显示信息

    这个方法应该对Django version 2.2.4以后的版本都有效,因为我的项目是这个版本,其他版本我并没有测试. 首先找到Django的exception.py文件路径:  C:\python_ ...

  3. 1、安装配置Git私有服务器

    安装并配置一个私有的Git服务器吧,这样自己的代码就可以进行版本控制了,当然版本控制的重要性嘛,Please Baidu. 系统环境:64位Win10 Version 1909 安装步骤: 1.下载j ...

  4. APP——python——自动化环境搭建01

    前提:python以及pycharm安装完成. ---------------------------------------------------------------------------- ...

  5. 初识Java Java基础知识

    今天给大家带来的是初级Java基础部分的知识:包括初识Java.变量.常量.数据类型.运算符.各种选择结构.循环结构.数组等Java的基础语法部分!!!内容.步骤超详细,附有各种案例的源代码(可以直接 ...

  6. 全链路监控系统开源Pinpoint入门视频教程(最新版本1.8)

    pinpoint支持的模块 源码:https://github.com/naver/pinpoint技术概述:https://skyao.gitbooks.io/learning-pinpoint/c ...

  7. PHP 多维数组转json对象

    PHP 多维数组转json对象 php 数组转json对象,可能大家都知道要用json_encode,但是转换出来的格式多有不同,此处做个小小的记录! 1. 一维数组转json对象 <?php ...

  8. Vue学习-组件的基本使用(局部组件)

    目录 示例代码 1.创建组件(构造器对象创建-Vue.extend) 2.注册组件 3.使用组件 4.语法糖创建并注册组件 示例代码 http://jsrun.net/H8vKp/edit 1.创建组 ...

  9. 痞子衡嵌入式:利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列ROM中的FlexSPI驱动API实现IAP. 痞子衡的技术交流群里经常有群友提问: i.MXRT中的FlexSPI驱动 ...

  10. git和github入门指南(6)

    6.交作业的流程 以下内容是螺钉课堂在线就业班提交作业的要求,非螺钉课堂在线就业班学员不用学习 螺钉课堂作业全程采用git管理,希望在日常使用中,加深对git和github的理解 具体流程: 1.注册 ...