类的基本使用

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. idea出现 淇℃伅 乱码

    问题:我是idea出现 淇℃伅 乱码, 解决:修改 tomcat 下的 logging.properties这个文件 为 GBK 就好了. 参考:https://blog.csdn.net/weixi ...

  2. Windows 程序设计(4) MFC-02 基本控件-上

    1. Button 按钮控件 1.1.按钮控件的基本使用 新建对话框工程,拖拽按钮控件,添加点击事件响应函数! a.双击模版进行添加: b.事件方式进行添加: button的常见事件类型 void C ...

  3. ULVAC爱发科皮拉尼真空计SW1-N说明书-手册

    ULVAC爱发科皮拉尼真空计SW1-N1/N2/N SWP-16-N/传感器单元规管 https://wenku.baidu.com/view/cff03803a6c30c2259019ef5.htm ...

  4. 移动 Ubuntu16.04 桌面左侧的启动器到屏幕底部_设置方法

    通过命令行,对 Launcher 的位置进行一下调整. 按下 Ctrl + Alt + t 键盘组合键,调出终端,在终端中输入以下命令: gsettings set com.canonical.Uni ...

  5. cc32b_demo-32dk2j_cpp_纯虚函数与抽象类2-txwtech

    cc32b_demo-32dk2j_cpp_纯虚函数与抽象类2-txwtech //纯虚函数是用来继承用的//纯虚函数//抽象类-抽象数据类型//*任何包含一个或者多个纯虚函数的类都是抽象类//*不要 ...

  6. mysql大表在不停机的情况下增加字段该怎么处理

    MySQL中给一张千万甚至更大量级的表添加字段一直是比较头疼的问题,遇到此情况通常该如果处理?本文通过常见的三种场景进行案例说明. 1. 环境准备 数据库版本: 5.7.25-28(Percona 分 ...

  7. Mysql使用xtrabackup备份失败处理

    在生产环境中使用的是xtrabackup,对mysql进行备份,每天0点开始备份,周日是全量备份,其他时间是基于周日做的增量备份,通过脚本实现,每天备份完成后会发送短信,突然有一天,备份全部失败,手动 ...

  8. Nginx具体配置(三)

    一:Nginx配置实例 - 反向代理 实例一: 1.1:实现效果 在Windows浏览器地址栏中输入www.123.com,跳转到Linux系统中的tomcat主页面 访问Nginx:192.168. ...

  9. json 文件注释

    json文件注释: "_comment":"this is commets", "jsondata":{ "注释":&q ...

  10. ssh生成单个公钥

    ssh生成单个公钥命令: ssh-keygen -t rsa -b 4096 -C "your_email@example.com" 查看公钥: cat ~/.ssh/id_rsa ...