【python | linux09】类属性、实例属性、面向对象四大特征

简介: 在类的属性中,分为公有类属性和私有类属性;公有类属性:所有对象都可访问;私有类属性:只能在类内部访问,不能通过实例对象访问

🍁作者简介:🏅云计算领域优质创作者🏅新星计划第三季python赛道TOP1🏅 阿里云ACE认证高级工程师🏅

✒️个人主页:小鹏linux

💊个人社区:小鹏linux(个人社区)欢迎您的加入!

目录

1、类属性、实例属性

1.1类属性

1.1.1添加类属性

1.1.2使用类属性

1.1.3再加1个类属性

1.2类方法

2.实例属性(对象属性)

2.1给某个对象添加的

2.2通过实例(对象)去修改类属性

2.3_ _del_ _()方法通过实例(对象)去修改类属性

3.面向对象四大特征

3.1抽象

3.2封装

3.3继承

3.4多态

👑👑👑结束语👑👑👑


1、类属性、实例属性

1.1类属性

在类的属性中,分为公有类属性和私有类属性

公有类属性:所有对象都可访问
私有类属性:只能在类内部访问,不能通过实例对象访问

1.1.1添加类属性

我们现在给Dog类添加狗的数量属性(num_of_dogs)。

类属性不能通过self.xxx = yyy的形式创建,因为这样创建出来的是实例属性。

类属性的创建方式很简单:直接写在类中,不要写在init函数中,也不要加self.:

#类是一个模板class Dog:num_of_dogs = 0 # 类属性 #构造方法 - 添加实例属性,做其他的初始化工作def __init__(self, name, height, power): self.name = name self.height = height self.power = power self.blood = 10 print(f"{self.name}出生了,汪汪!")

1.1.2使用类属性

类属性是属于类的,访问类属性要通过类名访问。下面的代码做了几件事情:

1.在init函数中,一旦创建一个新的Dog,给num_of_dogs加一

2.添加了一个die()方法,表示一个Dog去世了,一旦调用了die(),num_of_dogs就会减1。

3.创建了多个dog,测试numer_of_dogs数量变化;循环30次,随机选择一个Dog,调用die方法。

这里用到了随机模块random,还有自加(+=),自减(-+)运算符,不熟悉请自行补充相关知识

本案例有点血腥,请动物爱好者不要入戏太深,一切为了学习编程。可以把Dog改成其他,比如蟑螂(小强)。说到这里,我好想念我曾经的那些狗狗。

import random#类是一个模板class Dog:num_of_dogs = 0 # 类属性 #构造方法 - 添加实例属性,做其他的初始化工作 def __init__(self, name, height, power): self.name = name self.height = height self.power = power self.blood = 10 print(f"{self.name}出生了,汪汪!") Dog.num_of_dogs += 1 def die(self): print(f"{self.name}已安息!") Dog.num_of_dogs -= 1# 创建100条狗,放到列表中dogs = []for i in range(100): d = Dog(f"dog{i}", random.randint(30, 80), random.randint(1,12)) print(Dog.num_of_dogs) dogs.append(d)# 循环30次,每次随机选择一条狗,让它死掉for i in range(30): dog = random.choice(dogs) dog.die() print(Dog.num_of_dogs)

1.1.3再加1个类属性

假设我们要判定一条狗是否可以成为警犬,我们用身高height来判定,如果height超过了60就可以。这个60就是警犬的标准。这个数字是对所有的Dog是通用的,是一个类属性。

import random#类是一个模板class Dog:num_of_dogs = 0 # 类属性 police_height = 60 # 成为警犬的身高标准 # --省略init和die方法 # 判定是否可以成为警犬,返回True或者False def can_be_police(self): return self.height > Dog.police_height# 创建100条狗,放到列表中dogs = []for i in range(100): d = Dog(f"dog{i}", random.randint(30, 80), random.randint(1,12)) print(Dog.num_of_dogs) dogs.append(d)print(f'成为警犬的身高标准是:{Dog.police_height}')for d in dogs: if(d.can_be_police()): print(f'{d.name} 可以成为警犬')

代码说明:

添加了一个police_height类变量

添加了一个实例方法,判定当前的dog是否可以成为警犬

代码最下方打印出可以成为警犬的狗的名字代码实践技巧

你可能会想,这个60直接写在代码里不可以吗?还要定义成变量?

直接写数字60不是不可以,但有诸多弊端:

多个地方用到,可能会写错,出现不一致。如果标准从60提高到了62,要修改多个地方定义成了变量,代码更容易懂。要不然看到60个这个数字,不一定理解是什么意思。实际上,polic_height通常不会改变,我们也可以称他为常量。

常量和变量没什么区别,一般常量的名字都是全大写的,仅此而已。看到全大写就知道这个值是不会改变的,实际上是可以改变的,只是一个约定。

这里的不会改变是指不会在程序运行中动态改变。把常量的值从60改成62属于修改代码,任何时候都可以的。

1.2类方法

仔细看一下前面定义的方法,他们都有两个特征:

方法的第一个参数都是self它们都使用了实例变量,脱离了具体的实例,这些方法是无法运行的,是没有意义的

2.实例属性(对象属性)

2.1给某个对象添加的

#创建一个类
class Person(object):
    #类属性
    num = 0  #公有类属性
    _ _age = 12 #私有类属性
    def _ _init_ _(self):
         self.name = "小明"  # 实例属性
        self.__sex = "男"  #私有实例属性
p = Person()
print(p.num)         #对象可以在类外通过实例对象访问公有属性
print(Person.num)    #对象可以在类外通过类对象访问公有属性
#print(p.__age) #错误,对象不能在类外通过实例对象访问私有的类属性
#print(Person.__age) #错误,对象不能在类外通过类对象访问私有类属性
print("="*50)
print(p.name)
print(p.sex)
#print(Person.name)#错误,不能通过类对象访问实例属性
#print(Person.sex)

image.gif

2.2通过实例(对象)去修改类属性

class Person(object):
    name = "xiaoming"
p = Person()
print(p.name)
p.name = "小红"   通过小红修改xiaoming,屏蔽掉同名属性
print(p.name)
print(Person.name)
del p.name #删除实例属性
print("-"*30)
print(p.name)

image.gif

2.3_ _del_ _()方法通过实例(对象)去修改类属性

创建对象后,Python解释器默认调用_ _init_ _()方法。当删除一个对象时,Python解释器也会默认调用一个方法,这个方法为_ _del_ _()方法。在Python中,对于开发者来说很少会直接销毁对象(如果需要,应该使用del关键字销毁)。Python的内存管理机制能够很好的胜任这份工作。也就是说,不管是手动调用del还是由Python自动回收都会触发_ _del_ _方法执行。 (不推荐)
class Person(object):
    def __init__(self,name):
        self.name = name
    def __del__(self):
        print("Python解释器开始回收%s对象了"%self.name,id(self))
zhangsan = Person("张三")
print("实例对象张三:",id(zhangsan))
print("----------")
lisi = Person("李四")
print("实例对象李四:",id(lisi))

image.gif

import sys
class Test:
    #当内存释放该对象的时候调用
    def __del__(self):
        print("英雄谢幕.....")
t = Test()
c = t
print(sys.getrefcount(c)) #测量对象的引用个数,测量的数字会比真实数字多一个
del t
print(sys.getrefcount(c))
del c
print("-----------")

image.gif

3.面向对象四大特征

3.1抽象

忽略一个主题中与当前目标无关的东西,专注的注意与当前目标有关的方面.( 就是把现实世界中的某一类东西, 提取出来, 用程序代码表示, 抽象出来的一般叫做类或者接口).

抽象并不打算了解全部问题, 而是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一个数据抽象,二是过程抽象.

数据抽象 -->表示世界中一类事物的特征,就是对象的属性.比如鸟有翅膀,羽毛等(类的属性)

过程抽象 -->表示世界中一类事物的行为,就是对象的行为.比如鸟会飞,会叫(类的方法)

3.2封装

属性,方法----》封装类

有些时候我们不希望把对象的属性公开,就可以把它设为私有,Python并没有像其他语言对成员的权限控制系统,如private,默认情况下,Python的所有属性都是公有的,可以被访问到,要设成私有,则在前面加双下划线。

3.3继承

继承可以使子类拥有父类的属性和方法,并且可以重写这些方法,加强代码的复用性Python中子类可以有多个父类,但是不建议这样使用,一般会产生重复调用的问题,Super().方法名,可以调用父类的方法(不用传参,作用是调用父类的方法,传的是子类实例的值)

3.4多态

多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承,Python里面不依赖继承)。

指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式

预告:

下期文章详细举例及介绍抽象面向对象四大特征

👑👑👑结束语👑👑👑

image.gif

目录
相关文章
|
1月前
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
109 34
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
1月前
|
物联网 Python
请问:如何使用python对物联网平台上设备的属性进行更改?
为验证项目可行性,本实验利用阿里云物联网平台创建设备并定义电流、电压两个整型属性。通过Python与平台交互,实现对设备属性的控制,确保后续项目的顺利进行。此过程涵盖设备连接、数据传输及属性调控等功能。
|
1月前
|
人工智能 编译器 Python
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
41 0
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
|
2月前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
172 5
|
2月前
|
存储 数据处理 Python
Python如何显示对象的某个属性的所有值
本文介绍了如何在Python中使用`getattr`和`hasattr`函数来访问和检查对象的属性。通过这些工具,可以轻松遍历对象列表并提取特定属性的所有值,适用于数据处理和分析任务。示例包括获取对象列表中所有书籍的作者和检查动物对象的名称属性。
43 2
|
2月前
|
关系型数据库 开发者 Python
Python编程中的面向对象设计原则####
在本文中,我们将探讨Python编程中的面向对象设计原则。面向对象编程(OOP)是一种通过使用“对象”和“类”的概念来组织代码的方法。我们将介绍SOLID原则,包括单一职责原则、开放/封闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则有助于提高代码的可读性、可维护性和可扩展性。 ####
|
3月前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
4月前
|
Python
Python面向对象(2)
【10月更文挑战第14天】
Python面向对象(2)
|
4月前
|
设计模式 程序员 C语言
Python面向对象
【10月更文挑战第13天】
Python面向对象
|
4月前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
45 1

热门文章

最新文章