面向对象
前言
- 个人学习笔记,仅供本人复习使用
- 主要内容来自7七月
- 第一次记录时间:2020年2月12日
类和对象
定义类:
class
关键字
名称推荐使用首字母大写,双英文单词使用两个大写字母
(StudentHomework)
类最基本作用是封装
类的内部
- 定义变量
- 定义函数
调用类
实例化
class Student():
name = ""
age = 0
def print_file(self):
print("name:"+ self.name)
print("aeg:"+ str(self.age))
student = Student()
student.print_file()
# 输出
name:
aeg:0
类
类是现实世界或者思维世界的实体在计算机中的反映
他将数据及这些数据上的操作封装在一起
构造函数
实例化时自动调用构造函数
class Student():
name = ""
age = 0
def __init__(self):
print("student")
def print_file(self):
print("name:"+ self.name)
print("aeg:"+ str(self.age))
student = Student()
a = student.__init__()
print(type(a))
#输出
student
student
<class 'NoneType'>
直接调用构造函数,无返回值
类变量和实例变量
class Student():
name = ""
age = 0
def __init__(self, name, age):
name = name
age = age
def print_file(self):
pass
student1 = Student("123", 12)
student2 = Student("124", 15)
print(student1)
print(student2)
print(student1.name)
print(student2.age)
#输出
<__main__.Student object at 0x0000021D6B9DE240>
<__main__.Student object at 0x0000021D6B9DE2B0>
0
# 区分
class Student():
# 类变量
name = "333"
age = 0
def __init__(self, name, age):
# 实例变量
self.name = name
self.age = age
def print_file(self):
pass
student1 = Student("123", 12)
student2 = Student("124", 15)
print(Student.name)
print(Student.age)
print(student1.name)
print(student1.age)
print(student2.name)
print(student2.age)
# 输出
333
0
123
12
124
15
当没有使用self
赋值时
class Student():
name = "333"
age = 0
def __init__(self, name, age):
name = name
age = age
def print_file(self):
pass
student = Student("123", 12)
print(student.age)
print(student.__dict__)
#输出
0
{}
输出为类变量,实例里无结果,返回空字典
当使用self
赋值时
class Student():
name = "333"
age = 0
def __init__(self, name, age):
self.name = name
self.age = age
def print_file(self):
pass
student = Student("123", 12)
print(student.age)
print(student.__dict__)
#输出
12
{'name': '123', 'age': 12}
小结
- 访问对象时,会先查找对象变量,即
__dict__
字典中的内容 - 如字典中没有时,会去类变量中寻找,返回结果
- 变量名是
self.变量名
class Student():
name = "333"
age = 0
def __init__(self, name, age):
self.name = name
self.age = age
def print_file(self):
pass
student = Student("123", 12)
print(student.age)
print(student.__dict__)
print(Student.__dict__)
#输出
12
{'name': '123', 'age': 12}
{'__module__': '__main__', 'name': '333', 'age': 0, '__init__': <function Student.__init__ at 0x000001F21C2C66A8>, 'print_file': <function Student.print_file at 0x000001F21C2C6730>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
self
与实例方法
- 实例方法:实例可以调用的方法
- 定义时第一个参数推荐使用
self
;调用时不需要写self
self
指的是调用当前方法的对象,谁调用了这个方法,self
指的就是谁
实例方法中访问实例变量与类变量
思维导图内容小结
1、变量与方法
变量:事物的特征
方法::事物的行为
2、方法与变量的关系:
绝大多数情况下,方法需要对变量做一系类运算或者逻辑上的一些操作,最终去改变变量的一些状态
3、构造函数与实例方法的区别
- 调用方式不一样
构造函数:类名(参数)
实例方法:对象.实例方法(参数) - 意义不一样
构造函数:初始化类的特征
实例方法:描述类的行为
实例方法中访问实例变量与类变量
实例方法访问实例变量:self.变量
实例方法访问类变量
self.__class__.变量
- 类.变量
类方法
@classmethod
def demo(cls):
pass
cls
代表类本身
操作与实例无关的类变量
静态方法
@staticmethod
def add(x, y):
print("这是静态方法")
静态方法可以被类或对象调用
静态方法和类方法内部都不能访问实例变量
能用静态方法的地方都可以用类方法代替,正常情况下不需要用静态方法
小结