# 封装:将属性和方法封装到类中,通过构造类的对象来实现功能
# 在面向对象的程序设计过程中有两个重要概念:类(class)和对象(object,也被称为实例,instance),其中类是某一批对象的抽象,可以把类理解成某种概念;对象才是一个具体存在的实体。
# 定义类的关键字: class
'''
语法
class ClassName:
语句块
类中包含属性和方法
属性直接编写
方法就是函数,且这个函数第一个参数默认是self
类的命名
驼峰式命名
首字母大写,以后的每个单词的首字母均大写
不要使用中文,空格,特殊字符,关键字,保留字
属性和方法命名
小写字母,以后的每个单词前使用下划线连接 a_b
Python 的类大致有如下作用
定义变量;
创建对象;
派生子类;
'''
# 为什么会有类:比如我们要形容一个学生,这个学生学习很多门课程,如果每门课程都用一个变量去形容(或使用字典,列表去描述),那么会显得太零散,而当我们要形容的学生太多,就需要有很多变量去描述,为了解决这个问题,便有了类。我们可以给每个学生定义一个类,将这个学生相关的全部放入到这个类中
# 定义一个不包含任何类变量和方法,这个类相当于一个空类,使用 pass 语句作为占位符,空类没有太大的实际意义
class Empty:
pass
# 定义一个类
class Student:
# 类属性
name = None
# 方法,函数
def act(self):
print("跳舞")
# 对象创建
a = Student()
print(a)
print(type(a))
print(a.name)
# 操作属性,设置属性
a.name = "Tony"
# 获取属性
print(a.name)
# 调用对象的方法
# 类后面的括号代表创建对象,函数后面的括号代表调用、执行
a.act()
# 构造函数 __init__
# Python 中很多以双下划线开头、双下划线结尾的方法,都具有特殊的意义
# 构造方法是一个类创建对象的根本途径,因此 Python 还提供了一个功能:如果开发者没有为该类定义任何构造方法,那么 Python 会自动为该类定义一个只包含一个 self 参数的默认的构造方法
#与函数类似的是,Python 也允许为类定义说明文档,该文档同样被放在类声明之后、类体之前
# 对象属性和类属性
class Students:
'这是Python定义的一个Students类,类说明'
# 类变量,被类和对象共有
name = None
def __init__(self,a_name):
# 成员变量,对象变量,对象独有的
self.a_name = a_name
# 下面定义了一个act方法
def act(self):
print("跳舞")
a = Students (a_name="Linda")
a.name = "Tom"
print(a.name)
print(a.a_name)
b = Students (a_name="Diana")
print(b.a_name)
print(b.name)
Students.name = "Karl"
print(a.name)
print(b.name)
c = Students(a_name="Lisa")
print(c.name)
Students.a_name = "Jack"
print(Students.a_name)
print(a.a_name)
print(b.a_name)
print(c.a_name)
'''
总结
是类的,也是这个类所有实例的,其实例都可以访问到;
是实例的,就是这个实例自己的,通过类访问不到
类变量是属于类的变量,这个类的所有实例可以共享这个变量
对象(实例或类)可以动态的给自己增加一个属性(赋值即定义一个新属性)
实例.dict[变量名]和实例.变量名都可以访问到自己的属性(但两种访问有本质上的区别的)
实例的同名变量会隐藏掉类变量,或者说是覆盖这个类变量,但是类变量依旧存在,并不是真正的覆盖
'''
# 对象的销毁
# 类中可以定义__del__方法,称为析构函数。
# 作用:销毁类的实例的时候调用,以释放占用的资源,其实就放些清理资源的代码。
# 注意这个方法不能引起对象的真正销毁,只是对象销毁的时候会自动调用它。
# 使用del语句删除实例,引用计数减1.当引用计数为0时,会自动调用__del__方法,由于# Python是实现了垃圾回收机制,不能确定对象何时执行垃圾回收。
class People:
def __init__(self,name,age=18):
self.name=name
self.__age=age
def __del__(self):
print(self.name)
def item():
tom=People('tom')
tom.__del__()
tom2=tom
print(1,'del')
del tom
print(2,'del')
del tom2
print('删除')
item()
# item()由于垃圾回收对象销毁时,才是真正的清理对象,还会在回收对象之前自动调用__del__方法,除非你明确知道自己的目的。