类的基本使用

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. 备份、恢复数据库(Dos命令提示符下)_数据库安装工具_连载_1

    Dos命令提示符下: 备份.恢复数据库,是不是很简单啊,是的,当你20年不碰MS SQL,是不是又忘记了呢,答案也许也是吧,^_^虽然在程序中执行SQL代码时,很讨厌那个Go,正如MySQL中那个分号 ...

  2. controlfile的情景恢复

    控制文件测试 百度百科:控制文件(Control File)是Oracle的物理文件之一,它记录了数据库的名字.数据文件的位置等信息.控制文件的重要性在于,一旦控制文件损坏,数据库将会宕机.如果没有数 ...

  3. kafka全部数据清空

    kafka全部数据清空的步骤为: 停止每台机器上的kafka: 删除kafka存储目录(server.properties文件log.dirs配置,默认为“/tmp/kafka-logs”)全部top ...

  4. ida 调试android之路

    系统: Mac OSX 调试环境:IDA7.0,  adb 手机环境:红米手机 android 4.4.4 前提条件: 红米手机root之路:https://www.cnblogs.com/dzqdz ...

  5. Docker精华 ,超全文档!

    我们的口号是:再小的帆也能远航,人生不设限!!    学习规划:继续上篇 <Docker入门>https://www.cnblogs.com/dk1024/p/13121389.html  ...

  6. (二)、JAVA运行时数据区域

    根据<Java 虚拟机规范(Java SE 7版)>规定,Java虚拟机所管理的内存,将会包括以下几个运行时数据区域: 注: 1.由所有线程共享的数据区: 对应 java内存模型的主内存, ...

  7. Skywalking的存储配置与调优

    https://blog.csdn.net/smooth00/article/details/96479544 作为一款APM和全链路监控平台,Skywalking算是挺出色的.Skywalking是 ...

  8. 2020/6/11 JavaScript高级程序设计 DOM

    DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口).他描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 10.1 节点层次 DOM将任何HTML和XML ...

  9. 云服务器终端命令显示-bash-4.2#怎么解决

    原因:删除了root/.bashrc 和 root/.bash_profile两个文件的丢失 解决办法: -bash-4.2# cp /etc/skel/.bashrc /root/ -bash-4. ...

  10. 重学 Java 设计模式:实战备忘录模式「模拟互联网系统上线过程中,配置文件回滚场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 实现不了是研发的借口? 实现不了,有时候是功能复杂度较高难以实 ...