Python3学习(七)

类中的私有属性

私有属性的定义,是以"__value"格式定义,只允许在类中的方法使用,不允许直接通过对象获取。

上栗子:


class Animal:
    def __init__(self,new_age):
        self.age = new_age #公有属性的定义,即允许在类中的方法使用,也允许直接通过对象获取
        self.__name = "小黑" #私有属性的定义,只允许在类中的方法使用,不允许直接通过对象获取

    def get_age(self):
        return self.age

    def get_name(self):
        return self.__name

dog = Animal(16)
print(dog.get_age())
print(dog.age)

print(dog.get_name())
#print(dog.__name)

#结果:
ubuntu@ubuntu16:/work/python/8-day$ python3 1-私有属性.py 
16
16
小黑

如上述栗子,如果使用print(dog.__name)直接获取__name这个私有属性,将会报如下错误。

ubuntu@ubuntu16:/work/python/8-day$ python3 1-私有属性.py 
16
16
Traceback (most recent call last):
  File "1-私有属性.py", line 23, in <module>
    print(dog.__name)
AttributeError: 'Animal' object has no attribute '__name'

认为Animal类中没有__name这个属性。

类中的私有方法

私有方法的定义,“def __func(self):”只允许在类中的方法使用,不允许直接通过对象获取

举个栗子:

class Animal:
    
    def __init__(self,new_age):
        self.age = new_age #公有属性的定义,即允许在类中的方法使用,也允许直接通过对象获取
        self.__name = "小黑" #私有属性的定义,只允许在类中的方法使用,不允许直接通过对象获取


    def get_age(self):
        return self.age

    def get_name(self):
        return self.__name

    def __color(self): #私有方法的定义,只允许在类中的方法使用,不允许直接通过对象获取
        print("-----红色------")

    def get_color(self):
        self.__color()

dog = Animal(18)

print(dog.get_age())
dog.get_color()
#dog.__color()
ubuntu@ubuntu16:/work/python/8-day$ python3 2-私有方法.py 
18
-----红色------

如果使用dog.__color()调用私有方法__color(),将会报如下错误。

ubuntu@ubuntu16:/work/python/8-day$ python3 2-私有方法.py 
18
Traceback (most recent call last):
  File "2-私有函数.py", line 24, in <module>
    dog.__color()
AttributeError: 'Animal' object has no attribute '__color'

认为Animal类中没有__color这个属性。

__del__方法

当我们通过类创建一个或多个对象之后,创建对象的时候,即会在内存中创建一片内存空间,当我们del 对象或者程序运行结束,类中默认会调用__del__方法,该方法有一定的实用效果,比如打游戏的时候,人物死掉的特效音效或动作,都可以在__del__方法中实现。

举个栗子:

class A:
    def __del__(self):
        print("----del-----")
a = A()
print("---------")
#结果:
ubuntu@ubuntu16:/work/python/8-day$ python3 3-__del__.py 
---------
----del-----

在程序运行结束,将调用__del__方法。

那么如果我提前删除掉对象a,我们来看看会是什么效果。

class A:
    def __del__(self):
        print("----del-----")

a = A()
del a
print("---------")
# 结果:
ubuntu@ubuntu16:/work/python/8-day$ python3 3-__del__.py 
----del-----
---------

使用del删除对象之后,即会调用__del__方法。

class A:
    def __del__(self):
        print("----del-----")

a = A()
b = a #创建对象b,并指向a所指向的位置
del a
print("---------")
#结果:
ubuntu@ubuntu16:/work/python/8-day$ python3 3-__del__.py 
---------
----del-----

我们可以看到创建对象b之后,del a删除,结果调用__del__方法在打印---------之后,这是为什么?

在内存中,b = a之后会将对象的引用计数加一,只有引用计数为0的时候才会调用类中的__del__方法。删除对象a之后,b对象仍然存在,所以不会调用__del__,等到程序运行结束之后,才会调用__del__方法。

在这里插入图片描述

测试对象的引用计数

模块sys下的方法getrefcount(对象),去测试同一个类下的对象的引用计数

In [2]: import sys

In [3]: sys.getrefcount
Out[3]: <function sys.getrefcount>

In [4]: class A: #创建类A
   ...:     pass
   ...: 

In [5]: a = A() #创建对象a

In [6]: sys.getrefcount(a) #getrefcount(a)方法本身会增加一个引用计数
Out[6]: 2 #所以得出的结果为2

In [7]: b = a #创建对象b

In [8]: sys.getrefcount(a)
Out[8]: 3

In [9]: del b

In [10]: sys.getrefcount(a)
Out[10]: 2

In [11]: del a

In [12]: sys.getrefcount(a) #一旦引用计数为0,那么说明该类下没有对象创建,再去测试引用计数,则报错
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-12-fb616ef7f1f4> in <module>()
----> 1 sys.getrefcount(a)

NameError: name 'a' is not defined

继承

继承的概念:子类 拥有 父类 的所有 方法 和 属性
在这里插入图片描述
继承的格式:

class 类名(父类名):
    pass
class Child(Father):
    pass

1.子类 继承自 父类,可以直接 享受 父类中已经封装好的方法,不需要再次开发

2.子类 中应该根据 职责,封装 子类特有的 属性和方法

专业术语

Dog 类是 Animal 类的子类,Animal 类是 Dog 类的父类,Dog 类从 Animal 类继承

Dog 类是 Animal 类的派生类,Animal 类是 Dog 类的基类,Dog 类从 Animal 类派生

class Animal:
	def eat(self):
		print("---animal eat---")
	def run(self):
		print("---animal run---")
	def sleep(self):
		print("---animal sleep---")


class cat(Animal):
	def catch(self):
		print("---cat catch---")
	
class dog(Animal):
	def bark(self):
		print("---dog bark---")

class XiaoTianquan(dog):
	def fly(self):
		print("---xiaotianquan fly---")


xtq = XiaoTianquan()
xtq.fly()
xtq.bark()
xtq.sleep()
xtq.eat()

#结果:
ubuntu@ubuntu16:/work/python/8-day$ python3 4-继承.py 
---xiaotianquan fly---
---dog bark---
---animal sleep---
---animal eat---

继承的传递性

C 类从 B 类继承,B 类又从 A 类继承,那么 C 类就具有 B 类和 A 类的所有属性和方法,子类 拥有 父类 以及 父类的父类 中封装的所有 属性 和 方法

提问:

哮天犬 能够调用 Cat 类中定义的 catch 方法吗?

答案:

不能,因为 哮天犬 和 Cat 之间没有 继承 关系

#上述代码后添加
...
xtq.catch()
#执行结果:
ubuntu@ubuntu16:/work/python/8-day$ python3 4-继承.py 
---xiaotianquan fly---
---dog bark---
---animal sleep---
---animal eat---
Traceback (most recent call last):
  File "4-继承.py", line 29, in <module>
    xtq.catch()
AttributeError: 'XiaoTianquan' object has no attribute 'catch'

方法的重写

子类 拥有 父类 的所有 方法 和 属性
子类 继承自 父类,可以直接 享受 父类中已经封装好的方法,不需要再次开发。

应用场景
当 父类 的方法实现不能满足子类需求时,可以对方法进行 重写(override)

class Animal:
	def eat(self):
		print("---animal eat---")
	def run(self):
		print("---animal run---")
	def sleep(self):
		print("---animal sleep---")


class cat(Animal):
	def catch(self):
		print("---cat catch---")
	
class dog(Animal):
	def bark(self):
		print("---dog bark---")

class XiaoTianquan(dog):
	def fly(self):
		print("---xiaotianquan fly---")
	
	def bark(self):
		print("---xiaotianquan 狂叫---")

xtq = XiaoTianquan()
xtq.fly()
xtq.bark()

# 执行结果:
ubuntu@ubuntu16:/work/python/8-day$ python3 5-重写.py 
---xiaotianquan fly---
---xiaotianquan 狂叫---

重写 父类方法有两种情况:
1.覆盖 父类的方法
2.对父类方法进行 扩展

class Animal:
	def eat(self):
		print("---animal eat---")
	def run(self):
		print("---animal run---")
	def sleep(self):
		print("---animal sleep---")

class dog(Animal):
	def bark(self):
		print("---dog 汪汪叫---")

class XiaoTianquan(dog):
	def fly(self):
		print("---xiaotianquan fly---")
	
	def bark(self):
		print("---xiaotianquan 狂叫---")
		#第一种调用被重写的父类的方法
		#dog.bark(self)
		#第二种方法
		super().bark()

xtq = XiaoTianquan()
xtq.fly()
xtq.bark()

#执行结果:
ubuntu@ubuntu16:/work/python/8-day$ python3 6-调用被重写的方法.py 
---xiaotianquan fly---
---xiaotianquan 狂叫---
---dog 汪汪叫---

父类的 私有属性 和 私有方法

子类对象 不能 在自己的方法内部,直接 访问 父类的 私有属性 或 私有方法

子类对象 可以通过 父类 的 公有方法 间接 访问私有属性 或 私有方法

私有属性、方法 是对象的隐私,不对外公开,外界 以及 子类 都不能直接访问
私有属性、方法 通常用于做一些内部的事情

class A:
	def __init__(self):
		self.num1 = 100
		self.__num2 = 200

	def test1(self):
		print("--test1--")
		self.__test2() #在该类中可以使用私有方法和私有属性
		print(self.__num2)
	
	def __test2(self):
		print("--test2--")


class B(A):
	def demo(self):
		pass

b = B()
b.test1()
#b.__test2() #私有方法不继承,并且不能直接调用私有方法
print(b.num1)
#print(b.__num2)#私有属性不继承,并且不能直接调用私有属性

B 的对象不能直接访问 __num2 属性
B 的对象不能在 demo 方法内访问 __num2 属性
B 的对象可以在 demo 方法内,调用父类的 test 方法
父类的 test 方法内部,能够访问 __num2 属性和 __test2 方法

多继承

概念:子类 可以拥有 多个父类,并且具有 所有父类 的 属性 和 方法。
例如:孩子 会继承自己 父亲 和 母亲 的 特性

语法:

class 子类名(父类名1, 父类名2...)
    pass

在这里插入图片描述
问题:如果不同的父类 中存在 同名的方法,子类对象 在调用方法时,会调用 哪一个父类中的方法呢?

提示:开发时,应该尽量避免这种容易产生混淆的情况! —— 如果 父类之间 存在 同名的属性或者方法,应该 尽量避免 使用多继承

在这里插入图片描述
Python 中的 MRO —— 方法搜索顺序
Python 中针对 类 提供了一个 内置属性 __mro__可以查看 方法 搜索顺序
MRO 是 method resolution order,主要用于 在多继承时判断 方法、属性 的调用 路径

print(C.__mro__)
输出结果: 
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

1.在搜索方法时,是按照 mro 的输出结果 从左至右 的顺序查找的
2.如果在当前类中 找到方法,就直接执行,不再搜索
3.如果 没有找到,就查找下一个类 中是否有对应的方法,如果找到,就直接执行,不再搜索
4.如果找到最后一个类,还没有找到方法,程序报错

新式类与旧式(经典)类

object 是 Python 为所有对象提供的 基类,提供有一些内置的属性和方法,可以使用 dir 函数查看

新式类以 object 为基类的类,推荐使用

经典类不以 object 为基类的类,不推荐使用

在 Python 3.x 中定义类时,如果没有指定父类,会 默认使用 object 作为该类的 基类 —— Python 3.x 中定义的类都是 新式类

在 Python 2.x 中定义类时,如果没有指定父类,则不会以 object 作为 基类

新式类 和 经典类 在多继承时 —— 会影响到方法的搜索顺序

为了保证编写的代码能够同时在 Python 2.x 和 Python 3.x 运行!

今后在定义类时,如果没有父类,建议统一继承自 object

class 类名(object):
    pass
<think>好的,用户想了解如何排查Linux系统的磁盘告警问题,我需要详细步骤和常用命令。首先,我得回忆一下之前学过的相关知识,结合提供的引用内容来整理回答。 首先,用户的问题是关于磁盘告警排查,所以需要从基础命令开始。引用[1]里提到了几个步骤,比如磁盘挂载情况、各目录使用情况,还有处理文件被删除但引用未释放的问题。这些应该是核心步骤。而引用[3]提到磁盘I/O过大的排查,可能也需要涉及iotop等工具。此外,引用[4]提到保留5%空间的情况,这也是一个常见但容易被忽视的点。 接下来,我需要组织步骤。通常排查磁盘问题会先看整体使用情况,用df命令,然后找具体哪个目录占用大,用du。但有时候删除的文件如果还被进程占用,空间不会释放,这时候需要lsof来找这些文件,并重启进程。引用[1]里的步骤正好覆盖了这些,所以可以按照这个顺序来写。 另外,用户可能需要知道如何处理特定问题,比如日志文件过大,比如binlog,这时候可以引用[5]的建议,清理旧的日志。还有保留空间的问题,引用[4]提到的调整保留空间的方法,可能需要用tune2fs命令。 还要考虑I/O过高的情况,这时候iotop(引用[3])和iostat命令就派上用场了。这些工具可以帮助看哪些进程在大量读写磁盘。 需要确保步骤清晰,分步骤讲解,每个步骤对应的命令和解释。同时,要提到可能遇到的坑,比如已删除未释放的文件,以及保留空间的问题,这些都是实际运维中常见的情况。 最后,生成相关问题的时候,可以围绕进一步的优化、具体命令的使用、其他相关工具(如日志轮转)来提问,这样用户如果有更深的问题,可以继续探索。 确保使用中文回答,数学公式用$...$,独立公式用$$...$$,不过这个问题可能数学公式较少,但如果有的话要注意格式。引用标注要正确,比如处理已删除文件的部分引用[1],保留空间引用[4],binlog清理引用[5],I/O工具引用[3]等。 现在把这些整理成一个结构化的回答,分步骤说明,每个步骤的命令和解释,以及注意事项。最后附上相关问题,帮助用户深入理解。</think>### Linux系统磁盘告警问题排查步骤及常用命令 #### 一、看整体磁盘使用情况 使用 **`df -h`** 命令看当前磁盘挂载情况及空间占用率。重点关注 **`Use%`** 列,快速定位盘的分区[^1][^2]。 ```bash df -h ``` #### 二、定位大文件或目录 通过 **`du -sh /*`** 逐级排查占用较大的目录。例如: ```bash du -sh /var/* | sort -rh # 看/var目录下各子目录大小 du -sh /home/* | sort -rh # 看/home目录占用 ``` #### 三、处理已删除但未释放空间的文件 若发现磁盘占用异常但未找到对应大文件,可能是进程仍持有已删除文件的句柄。使用 **`lsof | grep deleted`** 找此类文件[^1][^3]: ```bash lsof | grep deleted # 列出被删除但仍被进程占用的文件 kill -9 <PID> # 终止相关进程释放空间(需谨慎操作) ``` #### 四、检保留空间策略 Linux默认保留5%磁盘空间供root使用,可通过 **`tune2fs`** 调整[^4]: ```bash tune2fs -m 1 /dev/sda1 # 将保留空间比例从5%改为1% ``` #### 五、清理日志文件 针对常见日志文件(如Nginx、MySQL的binlog)进行清理[^5]: ```bash # 清理MySQL binlog(需在MySQL内执行) PURGE BINARY LOGS BEFORE '2023-01-01 00:00:00'; # 清理系统日志 journalctl --vacuum-size=200M # 保留最近200MB日志 ``` #### 六、排查磁盘I/O异常 若告警为I/O负载过高,使用以下工具分析: 1. **`iotop`**:实时监控进程级I/O[^3] ```bash iotop -o # 显示正在执行I/O的进程 ``` 2. **`iostat`**:看设备级I/O统计 ```bash iostat -x 1 # 每秒刷新一次详细I/O数据 ``` #### 七、关键配置文件检 **`/etc/fstab`** 是否配置异常,或使用 **`mount`** 命令确认挂载参数: ```bash mount | grep -i noquota # 检是否未启用磁盘配额 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linux顿悟吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值