python3面向对象

2023-10-26

一些术语

  • 类(class):
    • 用来描述具有相同的属性和方法的对象的集合。
    • 它定义了该集合中每个对象所共有的属性和方法。
    • 对象是类的实例。
    """ an example 4 learning"""
    class nClass:
    	i = 123456#<statement-1>可以有许多个<statement-i>  并且可以在外部访问
    	def f(self):
    		return('helllllo')
    x = nClass()		#实例化
    print("属性i为:",x.i)
    print("f的输出为:",x.f())
    
  • 类变量:
    • 类变量在整个实例化的对象中是公用的。
    • 类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用
  • 方法:类中定义的函数
  • 方法重写:
    • 如果从父类继承的方法不能满足子类的需求,可以对其进行改写,
    • 这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在函数(方法)中的变量,是作用于当前实例的类
  • 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量
  • 继承(可以部分参考C++):
    • 即一个派生类(derived class)继承基类(base class)的字段和方法。
    • 继承也允许把一个派生类的对象作为一个基类对象对待。
    • 例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 对象:
    • 通过类定义的数据结构实例
    • 对象包括两个数据成员(类变量和实例变量)和方法。

类的定义

	""" an example 4 learning"""
	class nClass:
		i = 123456#<statement-1>可以有许多个<statement-i>  并且可以在外部访问
		def f(self):
			return('helllllo')
	x = nClass()		#实例化
	print("属性i为:",x.i)
	print("f的输出为:",x.f())
class Stu():#类
	pass
stu_1 = Stu() #这里将stu_1用Stu实例化,叫实例化

创建实例是通过 对象名 = 类名() 实现

__init__方法:用来强制给一个类绑定属性,参数通过__init__穿戴到实例化操作上

class Stu(object):
	def __init__(self,name,score):
	self.name = name
	self.score = score
stu_1 = Stu(zhangsan,99)
print(stu_1.name,stu_1.score)

__init__的第一个参数必须是self(这个类本身,习惯写作self)
可以用self在内部绑定属性
self不用传入,Python自己传
self.name是属性变量 name是外界变量(传入)

self代表类的实例,而非类,也就是对象
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的*第一个参数名称* 按照惯例它的名称是 self。
在类的方法中 继承 self 可以方便在方法中访问类内部变量类内部方法

class Test:
	def prt(self):
		print(self)
		print(self.__class__)

结果为:
<main.Test instance at 0x100771878>
main.Test

这个self换成别的名字也是一样的,self代表的是当前对象(实例)的地址?->print(self)可见

self可以不写吗?
如例子:

class Test:
	def ppr():
		print(self)
t = Test()
t.ppr()

运行结果

Traceback (most recent call last):
  File "cl.py", line 6, in <module>
    t.ppr()
TypeError: ppr() takes 0 positional arguments but 1 was given

实际运行中将 t.ppr()解释成了 Test.ppr(t) 所以报错多一个参数
所以这里的ppr()应该写一个self才可以 ->ppr(self)

当然在定义中不使用这个类本身时不需要传入self,就不用写self
这样的称为类方法

类的方法


#类定义
class people:
	#定义基本属性,可以再外部直接访问
	name = ''
	age = 0
	#定义私有属性,私有属性在类外部不可以直接访问
	__weight = 0 #私有属性(变量也适用)是用两个下划线开头的变量
	#定义构造方法
	def __init__(self,n,a,w):
		self.name = n
		self.age = a
		self.__weight = w
	#定义方法
	def speak(self)
		print("%s 说:我%d岁"%(self.name,self.age))
#实例化
p = people('lily',10,30)
p.speak()

继承

支持继承
定义如下:

class DrivedClassName(BaseClassName):
	#子类,派生类	#父类,基类
	#子类继承父类的属性和方法
	#并且在自身内部可以添加属性和方法
	<statement-1>
	.
	.
	.
	<statement-N>
	#基类和派生类需要在一个作用域内

example:


#类定义
class people:
	#定义基本属性,可以再外部直接访问
	name = ''
	age = 0
	#定义私有属性,私有属性在类外部不可以直接访问
	__weight = 0 #私有属性(变量也适用)是用两个下划线开头的变量
	#定义构造方法
	def __init__(self,n,a,w):
		self.name = n
		self.age = a
		self.__weight = w
	def speak(self)
		print("%s 说:我%d岁"%(self.name,self.age))
#单继承
class student(people):
	grade = ''
	def __init__(self,n,a,w,g):
	#调用父类的构函
		people.__init__(self,n,a,w)
		self.grade = g
	#reride(覆写)父类方法
	def speak():
		print("%s says: I'm %d years old,I'm in %d grade"%(self.name,self.age,self.grade))
#实例化
s = student('lily',10,4)
s.speak()

self用法在继承中

class Parent:
    def pprt(self):
        print(self)

class Child(Parent):
    def cprt(self):
        print(self)
c = Child()
c.cprt()
c.pprt()
p = Parent()
p.pprt()

结果:

<__main__.Child object at 0x0000000002A47080>
<__main__.Child object at 0x0000000002A47080>
<__main__.Parent object at 0x0000000002A47240>

运行c.cprt()时指的是Child类的实例。
但是在运行c.pprt()时,等同于Child.pprt©,所以self指的依然是Child类的实例,由于self中没有定义pprt()方法,所以沿着继承树往上找到父类Parent中定义了pprt()方法,所以就会成功调用,这里的self指的仍是Child类的内容。

多继承

类定义:

	class DerivedClassName(Base1, Base2, Base3):
							#多个父类
    <statement-1>
    .
    .
    .
    <statement-N>

例程:


#类定义
class people:
	#定义基本属性,可以再外部直接访问
	name = ''
	age = 0
	#定义私有属性,私有属性在类外部不可以直接访问
	__weight = 0 #私有属性(变量也适用)是用两个下划线开头的变量
	#定义构造方法
	def __init__(self,n,a,w): #向下看(*)
		self.name = n
		self.age = a
		self.__weight = w
	def speak(self)
		print("%s 说:我%d岁"%(self.name,self.age))
#单继承
class student(people):
	grade = ''
	def __init__(self,n,a,w,g):
	#调用父类的构函
		people.__init__(self,n,a,w) #向上看(*)
		self.grade = g
	#override(覆写)父类方法
	def speak(self):
		print("%s says: I'm %d years old,I'm in %d grade"%(self.name,self.age,self.grade))

#再另一个类,多重继承准备
class speaker():
	topic = ''
	name = ''
	def __init__(self,n,t):
		self.name = n
		self.topic = t
	def speak(self):
		print("my name is %s,i'a speaker.the topic of my speach is %s"%(self.name,self.topic))

#多重继承
class sample(speaker,student):
a = ''
def __init__(self,n,a,w,g,t)
	student.__init__(self,n,a,w,g)
	speaker.__init__(self,n,t)
tea = sample("Tim",25,80,4,"python")
tea.speak()#方法名相同,默认调用的是在括号中排前的父类的方法

方法重写

当父类 k方法 不能满足需求时,在子类重写
就是把这个 k方法 重新在子类里写过,名字不变

类属性与方法

类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
类的方法
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods

实例 of 私有属性

class JustCounter:
	__secretCount = 0 #私有变量
	publicCount = 0	  #公开变量
	
	def count(self):
		self.__secretCount += 1
		self.publicCount += 1
		print(self.__secretCount)

counter = JustCounter()
counter.count()
counter.count()
print(counter.publicCounter)
print(counter.__secretCounter)#执行到这里会报错

私有方法 的 实例

class Site:
	def __init__(self,name,url):
		self.name = name #public
		self.__url = url #private
	def who(self)
		print('name :',self.name)
		print('url :',self.__url)
	def __foo(self):	#private method 
		print('this is a private method')
	
	def foo(self)
		printf('this is public method')
		self.__foo() #在这里,是类的内部,可使用
x = Site('ban','www.ban.com')
x.who()
x.foo()
x.__foo() #error

类的专有方法

__init__ : 构造函数,在生成对象时调用
__del__ : 析构函数,释放对象时使用
__repr__ : 打印,转换
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__truediv__: 除运算
__mod__: 求余运算
__pow__: 乘方

这些专有方法也可以重载(override)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3面向对象 的相关文章

随机推荐

  • 十年大厂产品的数据分析宝典(下):数据打点、分析、做图表、监控的实用技巧

    序 上半部分文章主要围绕指标 包括选定关键指标 主要指标VS次要指标 从关键结果指标拆解出过程指标 并定下阶段性目标 这些是数据分析的基础工作 在没有做好之前 不建议直接就开始做功能 打点取数等等 如果这部分已经做好了 那么可以看接下来的文
  • 一些测开面试题及答案(个人梳理)

    这里写目录标题 答案对错自辨 文明观看 有错给我说我改 1 白盒测试 黑盒测试 1 1白盒测试 1 2黑盒测试 2 测试流程 3 bug流程 4 压力测试 5 selenium原理 6 选取元素方法 7 servlet生命周期 8 Java
  • Baseline、Benchmark&SOTA

    Baseline Baseline A baseline is a value or starting point on a scale with which other values can be compared 通俗的讲 一个算法被称
  • 一个通过cookie实现的账号密码保存的案例(会分享cookie设置获取删除的封装函数哦)

    相信大家都玩过QQ 但细心地你是否发现有个保存密码的功能 当你选中保存账号密码时 等你下次登录的时候 将直接为你显示出来你的账号密码 省去了我们再次输入的时间 那么这样一个功能是如何实现的呢 我现在通过cookie简单为大家实现一下这个功能
  • 第六章树和二叉树-作业3-Huffman树

    判断题 1 1 对N 2 个权值均不相同的字符构造哈夫曼树 则树中任一非叶结点的权值一定不小于下一层任一结点的权值 T 选择题 2 1 对N N 2 个权值均不相同的字符构造哈夫曼树 下列关于该哈夫曼树的叙述中 错误的是 D A 树中一定没
  • XXE漏洞原理--简单理解

    XXE漏洞简介 1 XXE漏洞全称XML External Entity Injection 即xmI外部实体注入漏洞 XXE漏洞发生在应用程序解析XML输入时 没有禁止外部实体的加载 导致可加载恶意外部文件 造成文件读取 命令执行 内网端
  • 提供HTTP、HTTPS都可访问的API

    情景说明 考虑到数据的安全传输 现在用到HTTPS进行API调用的越来越多了 本节就介绍如何使自己编写的API能让别人 进行HTTP HTTPS调用 先看一下一般情况 正常编写一个 使用HTTP访问一下 不写的话 默认使用HTTP协议进行访
  • 八、模板方法模式

    定义 模板方法模式 在一个方法中定义一个算法骨架 而将一些步骤延迟到子类中 模板方法使得子类可以在不改变算法结构的情况下 重新定义算法中的某些步骤 UML类图 说明 1 AbstractClass抽象中包含了模板方法 primitiveOp
  • ERC20的创建及合约之间的调用(合约调用合约)

    ERC20 Token ERC20是一个token合约标准 具体的概念和友好的合约库 可参考openzeppelin 接下来的代码创建一个erc20 token SPDX License Identifier GPL 3 0 pragma
  • webupload 实现大文件分片上传

    废话不多说 直接上例子 html代码 div class layui form item div
  • 1.Ros初学笔记

    1 创建workspace 名字是catkin ws mkdir p catkin ws src 2 初始化环境 生成build 编译成功的可执行文件 devel src 代码包 cd catkin ws catkin make 3 为了让
  • Ubuntu JetBrains(JetBrains Account Error:JetBrains Account connection error: www.jetbrains.com)

    问题 Your host may be behind a proxy 在使用学生免费账户登录的时候出现错误 解决 修改 etc hosts文件 将其中的 jetbrains的相关行去掉即可
  • Over-COM:一种可折叠的头部医疗支架

    为了帮助医生对颅内疾病进行更精准的诊断 来自中国的Lailu Li科研团队设计了一个架空可折叠的头部支架 Over COM 该支架包括一个固定在患者头部的装置 外壳 8个线性执行器和1个IMU 惯性测量单元 以及一个远离病人的小盒子 包含微
  • Doc2vec计算文本相似度

    1 Doc2vec模型介绍 Doc2Vec模型基于Word2vec模型 并在其基础上增加了一个段落向量 以Doc2Vec的C BOW方法为例 算法的主要思想在以下两个方面 训练过程中新增了paragraph id 即训练语料中每个句子都有一
  • java栈与队列

    3 栈 栈是一种特殊的线性表 栈只能在一端 栈顶 进行操作 往栈里添加元素叫入栈 删除栈里的元素叫出栈 后进的元素先出 官方栈 java util Stack 栈的应用 浏览器的前进与后退 如果输入三个网址 假设123三个 出栈过程 后退操
  • SpringCloud服务间调用

    SpringCloud服务间的调用有两种方式 RestTemplate和FeignClient 不管是什么方式 他都是通过REST接口调用服务的http接口 参数和结果默认都是通过jackson序列化和反序列化 因为Spring MVC的R
  • 修改jar包增加自己需要功能的操作步骤(小白实践)

    一 修改静态文件的方式比较简单 1 先将要修改的jar包备份 cp xxx jar xxx 2 jar 2 建立一个新的目录便于后面的打包 mkdir jar tmp 3 将包放到刚刚创建的目录里解压 mv xxx 2 jar jar tm
  • GUI系统之SurfaceFlinger(11)SurfaceComposerClient

    文章都是通过阅读源码分析出来的 还在不断完善与改进中 其中难免有些地方理解得不对 欢迎大家批评指正 转载请注明 From LXS http blog csdn net uiop78uiop78 GUI系统之SurfaceFlinger章节目
  • qwtplot3D安装--终结解决方案

    帮同学做一个地热信息展示的软件 需要用到3D显示的内容 一方面 自己比较懒 懒去看OpenGL相关的内容 虽然以前做过3D开发相关的内容 但是毕竟需要处理的代码太多了 另一方面 也是一直在用QWT在帮他做2D图形显示这块 因此就想着用qwt
  • python3面向对象

    一些术语 类 class 用来描述具有相同的属性和方法的对象的集合 它定义了该集合中每个对象所共有的属性和方法 对象是类的实例 an example 4 learning class nClass i 123456