python面向对象

一文秒懂Python面向对象 在类定义中, 阅读详情

1. 构造方法

def __init__(self):
    pass

构造方法,可以理解为初始化方法,构造函数。主要功能:

(1)初始化一个类的属性

(2)当新成员被创建的时候,会自动调用。

class People:
    def __init__(self):
        print('hello world')

p = People()

class People:
    def __init__(self, name, age):
        print(name, ':', age)


p = People('小明', '20')

self

(1) self代表类的实例,而非类。

self代表的是类的实例。而self.__class__则指向类。

(2) self可以写成this

还是尊重常见的习惯,建议使用self

class People:
    def __init__(this):
        print('hello world')

p = People()

(3)方法第一个参数,必须为self,self代表的是类的实例

为什么一定要写self呢?

可以简单理解为:函数被实例调用的时候,它总得知道谁在调用吧。

class People:
    def __init__(self, name, age):
        # 通过下面和实例绑定
        self.name = name
        self.age = age
        print(name, ':', age)

    def eat(self):
        print(self.name,'吃什么')

p = People('小明', '20')
p.eat()

扫一扫欢迎关注【 python王哪去 】,一起学习!

2. 类属性与实例属性

类属性:公共属性,所有实例共享

实例属性:成员变量,每个实例独享

class People:
    p_nation = '中国'
    def __init__(self, name, age):
        # 通过下面和实例绑定
        self.name = name
        self.age = age
        print(name, ':', age)

p = People('小明', '20')


print(People.p_nation)
print(p.p_nation)

实例重新定义公共属性,其实是增加自己成员变量

class People:
    p_nation = '中国'
    def __init__(self, name, age):
        # 通过下面和实例绑定
        self.name = name
        self.age = age
        print(name, ':', age)

p = People('小明', '20')

p.p_nation ='美国'
print(p.p_nation) # 美国
print(People.p_nation) # 中国

3. 类的继承

继承是指将现有类的属性和行为,经过修改或重写之后,就可产生出拥有新功能的类,这样可以大幅提升程序代码的可重用性。更大的优势在于能够维持对象封装的特性。

在概念上来说:父类被称为基类,子类被称为派生类。

单继承

class Father:
    name ='Father'
    def work(self):
        print("在家种地")

class Son(Father):

   def __init__(self):
       pass

son = Son()
son.work()
# 在家种地
print(son.name)
# Father

重写父类方法 和 变量

class Father:
    name ='Father'
    def work(self):
        print("在家种地")

class Son(Father):

    name = 'Son'

    def work(self):
        print("在上学")

son = Son()
son.work()
# 在上学
print(son.name)
# Son

除了调用原来父类的方法,还根据自己的需求扩展了子类的方法。

class Father:
    def work(self):
        print("在家种地")

class Son(Father):
    def work(self):
        Father.work(self)
        print("在上学")


son = Son()
son.work()

所以,super() 函数调用父类

class Father:
    name = 'Father'

    def work(self,content):
        print("在家种地,",content)


class Son(Father):
    name = 'son'

    def work(self,content):
        super().work(content)
        print("在上学,学习",content)


f = Father()
f.work('花生')
s = Son()
s.work('语文')


# 在家种地, 花生
# 在家种地, 语文
# 在上学,学习 语文

4. 多继承

多继承是指派生类继承自多个基类,而这些被继承的基类相互之间可能都没有关系,简单地说,就是直接继承了两个或两个以上的基类。

class Animal:
    def content(self):
        print('它们都是动物')

class Horse(Animal):
    def content1(self):
        print('它是马')


class Donkey(Animal):

    def content2(self):
        print('它是驴')

class Mule(Horse, Donkey):
    def content3(self):
        print('它是骡子')

m = Mule()
m.content()
m.content1()
m.content2()
m.content3()

print(isinstance(m,Animal))
print(issubclass(Mule,Animal))
print(issubclass(Mule,Horse))
print(issubclass(Horse,Donkey))


它们都是动物
它是马
它是驴
它是骡子

True
True
True
False

相关函数

isinstance( 对象, 类)

判断第一个参数的对象是否属于第二个参数类的一种

issubclass(子类,父类)

如果类 1 是类 2 所指定的子类,则返回 True,否则返回 False

5. 封装

将数据和操作数据的方法 包装在一起 , 隐藏数据的内部细节 , 防止外界的直接访问和修改 。

封装后 , 只能通过 对外提供的接口 , 对 封装在内部的属性和方法 进行 访问和操作
 

成员变量 与 成员方法

class People:
    p_nation = '中国'

    def eat(self):
        print(self.p_nation)

私有成员变量 与 私有成员方法

私有成员变量 : 以 双下划线 开头 __私有成员变量名

私有成员方法 : 以 双下划线 开头 __私有成员方法名

class People:
    __name = '小明'

    def say(self):
        # 只能在内部掉用
        self.__name = '大明'
        self.__say() 
        print(self.__name)

    def __say(self):
        self.__name = '__大明'
        print('say chinese')


p = People()
p.say()

###########

say chinese
__大明

6. 多态

Python是弱类型语言,其最明显的特征是在使用变量时,无需为其指定具体的数据类型。这会导致一种情况,即同一变量可能会被先后赋值不同的类对象。

类的多态特性,还要满足以下 2 个前提条件:

(1)继承:多态一定是发生在子类和父类之间;

(2)重写:子类重写了父类的方法。

class People:
    def hello(self):
        print('hello people')

class Men(People):
    def hello(self):
        print('hello man')

class Women(People):
    def hello(self):
        print('hello woman')

class Test:
    def hello(self, arg):
        arg.hello()

p = People()
men = Men()
women = Women()
test = Test()
test.hello(p)
test.hello(men)
test.hello(women)

#######
hello people
hello man
hello woman

7. 类的一些方法

类的实例方法:在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数。

类的实例私有方法:__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods 。

class People:
    name = '小明'
    __name = '__小明'

    def say(self):
        # 只能在内部掉用
        self.__name = '大明'
        self.__say() 
        print(self.__name)

    def __say(self):
        self.__name = '__大明'
        print('say chinese')

p = People()
p.say()

###########

say chinese
__大明

类的方法: 无需实例化,可以通过类直接调用的方法,但是方法的第一个参数接收的一定是类本身。

使用类方法不需要定义一个实例,类方法中的cls指向类,不像实例方法中的self指向一个实例。定义类方法,需要在函数前添加@classmethod

class People:
    __name = '小明'

    @classmethod
    def hello(cls):
        print(cls.__name)



People.hello()

静态方法

一般用于和类对象以及实例对象无关的代码。也就是意思不能访问类变量,也不能访问实例变量。

class People:

    @staticmethod
    def hello_word():
        print('hello world')


People.hello_word()

属性方法(@property)

使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。

加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。


class People:

    @property
    def hello_1(self):
        return 'hello'

	@property
    def hello_2(self):
        return self.__name


p = People()
print(p.hello_1)
print(p.hello_2)

户进行属性调用的时候,直接调用hello_2即可,而不用知道属性名_name,因此用户无法更改属性,从而保护了类的属性。

8. 反射

python的反射机制,核心就是利用字符串去已存在的模块中找到指定的属性或方法,找到方法后自动执行(基于字符串的事件驱动)。

一般使用场景:动态的向对象中添加属性和方法;也可以动态的调用对象中的方法或者属性。

hasattr(obj,name_str)

判断输入的name_str字符串在对象obj中是否存在(属性或方法),存在返回True,否则返回False。

class People():
    nation = 'CN'

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def get_name(self):
        print(self.name)


p = People('小明',18)
print(hasattr(People, 'nation'))
print(hasattr(p, 'age'))
print(hasattr(People, 'get_name'))
print(hasattr(People, 'xxxxxx'))



True
True
True
False

getattr(obj,name_str)

将按照输入的name_str字符串在对象obj中查找,如找到同名属性,则返回该属性;如找到同名方法,则返回方法的引用;如果未能找到同名的属性或者方法。

class People():
    nation = 'CN'

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def get_name(self):
        print(self.name)


p = People('小明',18)

# 反射获取类变量
print(getattr(People, 'nation'))
# 反射获取成员变量
print(getattr(p, 'name'))
# 反射获取成员方法,返回方法是一个引用地址,要想执行该方法,需要在后面加上小括号
getattr(p, 'get_name')()


#########
CN
小明
小明

setattr(obj,name_str,value)

name_str为属性名或者方法名,value为属性值或者方法的引用。

class People():
    nation = 'CN'

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def get_name(self):
        print(self.name)


p = People('小明',18)

setattr(p, 'name','小小明')
print(getattr(p,'name'))
setattr(p,'new_get_name',p.get_name)
getattr(p, 'new_get_name')()

##################

小小明
小小明

delattr(obj,name_str)

将你输入的字符串name_str在对象obj中查找,如找到同名属性或者方法就进行删除。

删除属性和方法之后,再次调用就会报AttributeError错误

class People():
    nation = 'CN'

    def __init__(self,name,age):
        self.name = name
        self.age = age

    def get_name(self):
        print(self.name)


p = People('小明',18)


delattr(p,'name')
getattr(p,'name')
delattr(p,'new_get_name')
getattr(p, 'new_get_name')()


#######

AttributeError: 'People' object has no attribute 'name'

Python——面向对象 阅读详情

相关推荐

【Python】Python面向对象详解

面向对象的官方解释“把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化(specialization)和泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派。知乎上比较有趣的解释一句话说明什么是面向对象?你个士鳖,你们全家都是士鳖!好像有人说过这样的话,当头棒喝的方式虽然情感上不易接受,但记忆效果十分显著。

qq_60491112的博客 1645

Python基础—面向对象(超详版)

面向对象是一种编程范式,它将程序中的数据和操作封装在一个对象中,从而使得程序更加模块化、可重用和易于维护。在面向对象编程中,对象是类的实例化,类是一种抽象的数据类型,它定义了一组属性和方法。面向对象编程的核心思想是封装继承和多态。封装是将数据和操作封装在一个对象中,隐藏对象的内部实现细节,只暴露必要的接口给外部访问。继承是通过继承父类的属性和方法,来创建一个新的子类,子类可以重写父类的属性和方法,从而实现更加灵活的功能。多态是指同一个方法可以根据不同对象的实现方式,实现不同的行为。

weixin_50804299的博客 2万+

Python的核心知识——面向对象

一、WHY 学习面向对象? 假设现在有一个场景是这样的,我们要编写一个游戏,里面有主角,NPC,怪物等等这些模型,那么如果我们不学面向对象的话,我们就需要一个一个的编写它们的属性及动作,一般情况下,一个大型的游戏比如LOL(这游戏是真的火,都好几年了还没被干掉)里面的英雄,小兵,大龙,有好上百个模型吧。我们不可能一个一个的写,那代码量就不是一两个g那么大了(其实这就是面向过程的思想,POP)!仔细...

qq_41734243的博客 1017

Python面向对象详解(非常详细)

面向对象编程(Object-Oriented Programming,OOP)是一种常用的编程思想,它强调万物皆对象,因此在编程时我们可以将现实世界中的事物抽象成程序中的对象,从而更好实现软件的设计与开发。与传统的基于函数的编程不同,面向对象编程注重于将数据与行为封装在一起,即对象既包含数据状态,还包含可调用的行为方法。面向对象编程的特点在于,它具有封装、继承和多态三大特性。封装意味着将对象的状态和行为进行封装,使其对外只暴露必要的接口,从而提高了安全性和可维护性;

ZTLJQ的博客 3万+

Fluent新手避坑:遇到‘Floating point exception’别慌,这7个排查步骤帮你搞定

本文为Fluent新手提供了遇到‘Floating point exception’错误时的7个详细排查步骤。从理解浮点异常的本质到边界条件检查、时间步长设置、求解器选择、网格优化、亚松弛因子调节以及高阶格式的取舍,帮助用户快速定位并解决问题,确保CFD仿真的稳定性和准确性。

weixin_30480075的博客 260

在 CentOS Stream 10 上搭建 Kubernetes 集群并支持开发调试与日志查看

搭建 Kubernetes 集群的每个步骤详细的文档。

灵犀物润 1645

python | 基础学习(五)面向对象

文章目录一、面向对象的基本概念1、面向对象2、类和对象(1)类(2)对象(3)定义简单的类(4)创建对象(5)增加属性(6)`dir(函数名)` 查看函数的属性和方法①初始化方法__init__②在初始化方法内部定义属性③形参,使代码更灵活④__del__⑤__str__方法二、面向对象的三大特性1、面向对象封装应用1:Yilia的体重应用2:摆放家具应用3:士兵突击(1)身份运算符`is`、`is not`(2)私有属性和私有方法(3)伪私有属性和私有方法(科普)2、继承3、单继承(1)语法:(2)与继承

qq_44250700的博客 6470

生态位宽度计算&可视化展示(R语言)

物种的生态位越宽,该物种的特化程度就越小,倾向于泛化种(generalist species);物种的生态位越窄,倾向于是一个特化种(specialists species)。生态位宽度是指物种(或其它生物单位)在群落中所利用的各种不同资源的总和。本篇所使用为生态位宽度指数即**Levins的生态位宽度指数。

weixin_53705272的博客 4435

Python面向对象基础

Python面向对象

m0_70882914的博客 2894

Windows 10/11系统下TurboDesign 6.4.0完整安装指南(附序列号+破解补丁)

本文提供Windows 10/11系统下TurboDesign 6.4.0的完整安装指南,涵盖系统环境预检、安装程序部署、序列号处理及破解补丁部署等关键步骤。通过详细的安装教程和优化配置,帮助用户高效完成这款涡轮机械设计软件的安装与调试,解决常见兼容性问题。

s4t5u6v的博客 1031

【软碟通 | UltraISO】刻录光盘教程(制作U盘启动盘)

前言 今天老师说办公室的电脑有点卡,让我给重新安装一个 Windows 7 系统。于是就用软碟通(UltraISO)在 U 盘上刻录了一个 Windows 7 镜像,然后给老师重装了系统。顺便把制作 U 盘启动盘的教程也分享给大家。 软件 UltraISO v9.7.1.3519:点击跳转(密码:dd2k) 教程 将 U 盘插到电脑上,然后鼠标右击选择格式化(制作启动盘必须格式化) 点击文件-打开 选择下载好的系统镜像(如:Windows 7) 点击启动-写入硬盘映像 选择硬盘

XavierJ的博客 2万+

Python面向对象

"""人类"""# 将 传入 的名字 赋值给 人类对象 的 姓名属性# 将 传入的 性别 赋值给 人类对象的 性别属性。# 将传入的出生日期 赋值给 人类对象的 出生日期属性。# 根据 类型 创建 该 类型的 对象# 在 类型的后面 添加 小括号 负责创建对象,实际上 会 自动调用 类中定义的 __init__() 方法person = Person("张三", "男", "1990-10-10")person.name = "张三丰"# 获取 对象的 名字# 获取 对象的 性别。

jay丿的博客 2078

Pdu Router(PduR)模块

1. PduR路由基本功能 2. PduR总线网关功能 3. PduR缓存机制 4. 总结

weixin_43759043的博客 3850

python之面向对象总结

python之面向对象总结

weixin_51891232的博客 1571

uniapp(全端兼容) - 最新详细实现接入腾讯视频播放器功能插件,uniapp全平台端(小程序/H5网页/App/nvu)调用引入并使用腾讯视频播放组件完整全流程(详细示例源码,一键复制开箱即用)

uniapp腾讯视频,uniapp微信小程序腾讯视频,uniapp小程序接入腾讯视频详细示例教程源码,uniapp怎么在微信小程序平台使用腾讯视频插件,在uni-app中使用腾讯视频插件播放视频,uniapp调用腾讯视频,uniapp引入腾讯视频插件,uniapp小程序中引入腾讯视频无法播放,uniapp微信小程序平台引入腾讯视频播放不了黑屏,在uniapp开发的微信小程序中使用腾讯视频,uniapp如何引入腾讯视频插件播放视频,uni-app小程序平台引入腾讯视频插件播放腾讯视频,uniapp 小程序接入

✅ 精选推荐文章 1万+

YOLO11改进-注意力-引入级联组注意力机制(Cascaded Group Attention, CGA)

输入特征拆分:输入特征进入 CGA 模块后,被均匀拆分为个部分,每个部分作为一个注意力头的输入,这样每个头关注输入特征的不同部分,实现特征的并行处理,同时为提高注意力多样性奠定基础。注意力头计算单元:每个注意力头包含三个线性投影层、、用于将输入特征映射到不同子空间,以及计算自注意力的单元。在计算过程中,通过注意力头之间的级联操作,前一个头的输出会累加到下一个头的输入上,实现特征的逐步细化。

qq_64693987的博客 2491

Python面向对象的理解

python中一切皆为对象,类型的本质就是类!Python常用的数据结构如:List、tuple、dict、array、DataFrame或者Series等等都是类,类的实例就是对象。甚至连fp=open(’…/data/zhou.txt’)的句柄fp都可以作为(变量)对象传入函数。一切就是这么神奇!为了提高代码的复用性和更好的封装函数或变量的作用域,使用类再做一次封装会有用很多。 1.Pytho...

jp_zhou256的博客 1993

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

python中面向对象

面向对象 Object Oriented 面向对象的学习: 面向对象的语法(简单,记忆就可以搞定) 面向对象的思想(稍难,需要一定的理解) 面向过程和面向对象的区别 面向过程开发,以函数作为基本结构使用: 吃饭 -> 吃饭的函数 喝水 -> 喝水函数 洗衣服 -> 洗衣服的函数 睡觉 -> 使用充气娃娃的函数 看电影 -...

秋叶夏风的博客 631

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Python中,什么是面向对象?

面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。 类就是一个模板,模板里可以包含多个函数,函数里实现一些功能 对象则是根据模板创建的实例,通过实例对象可以执行类中的函数 class是关键字,表示类 创建对象,类名称后加括号即可 面向对象的三大特性是指:封装、继承和多态。 想了解更多关于面对对象的相关内容...

weixin_38746918的博客 4594

Python之面向对象

Python面向对象

m0_72009612的博客 299

python是不是面向对象语言,python是面向对象语言吗

Python究竟是不是面向对象的编程语言面向过程和面对对象是一种编程思想,不能说某某语言是不是面对对象或是面向过程,而是某某语言是否支持面对对象或面向过程。回归主题,python可以支持面对对象,但也可以支持面向过程,即使不支持面向对象的语言,比如c语言。python是面向对象的语言吗Python是一种面向对象、解释型、动态类型计算机程序设计语言 解释型:程序无需编译成二进制代码,而是在执行时对语...

weixin_35765226的博客 8689

python面向对象的含义_Python之面向对象理解

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。而面向对象的程序设计把计算机程序视为一组对象的集合,而...

weixin_39663729的博客 212
上一篇: 写给刚入学大数据专业或迷茫在为几两碎银转行的你
下一篇: python基础语法
大数据左右手
博客等级 码龄9年 475粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值