面向对象进阶
1.流程控制语句2.计算机基础3.编程语言介绍4.python语言介绍5.python解释下载与安装6.python知识补充+语法入门7.基本数据类型8.基本运算符9.用户交互 输入输出方法10.字符编码11.可变与不可变数据类型12.文件操作的基本流程13.文件的基本操作14.异常处理15.深浅拷贝16.函数定义和调用17.函数的调用18.名称空间和作用域19.装饰器20.迭代器和三元运算符21.模块与包22.random、os、json模块23.hashlib、time模块24.正则25.datetime、sys、logging模块26.正则re模块27.常用的内置函数28.初识面向对象
29.面向对象进阶
30.封装、继承、多态31.常用魔法方法和元类32.网络编程初识33.网络编程进阶34.并发编程之多进程35.并发编程之多线程36.并发编程之协程面向对象进阶
1.类属性和对象属性
- 类属性分为两种,一种是数据属性,一种是函数属性
class Person:
# country是数据属性,对象可以任意调用,也叫类变量
country = "上海"
def __init__(self, name, age):
# name,age 是实例变量
self.name = name
self.age = age
# 函数属性,绑定方法
def show(self):
message = f"{self.country}-{self.name}-{self.age}"
print(message)
print(Person.country) # 上海
p1 = Person("serein",20)
2.对象属性的查找顺序
class Student:
school = '清华大学'
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def read(self):
print(f'正在读书')
# 实例化类得到类对象
stu = Student(name='serein', age=18, gender='male')
# 对象的属性查找顺序
# 【1】首先从自己本身开始找 从 stu.__dict__ 开始找
# 【2】找不到再去实例化他的类中找 从 Student.__dict__ 开始找
# 【3】别的方法没有初始化过这个属性,并且这个类没有继承其他的类
# 【4】找不到就报错了
# 总结 : obj(对象) ---> class(类) ---> gender_class(父类) ---> 找不到直接报错
3.类的特殊方法
class Cat():
...
from new_class import Cat
class Animal():
...
class BlackCat(Cat):
...
class People:
'''这是一个People类的注释'''
def __init__(self, name, age):
self.name = name
self.age = age
def run(self):
'''
这是一个注释
:return:
'''
print(f"{self.name} can run!")
def login_auth(func):
def inner():
# 查看函数的名字
print(func.__name__) # index
return func()
return inner
@login_auth
def index():
pass
index()
person = People(name='serein', age=22)
# 类的名字
def check_class_name(class_name):
print(class_name.__name__)
check_class_name(class_name=People)
check_class_name(class_name=Animal)
# 查看类的文档字符串,查看类中的多行注释内容 ('''''' / """""")
def check_class_name(class_name):
print(class_name.__doc__)
check_class_name(class_name=People) # 这是一个People类的注释
check_class_name(class_name=Animal) # None
# 类的字典属性
def check_class_name(class_name):
print(class_name.__dict__)
check_class_name(class_name=People) # 这是一个People类的注释
check_class_name(class_name=Animal) # None
# 查看类定义所在的模块
def check_class_name(class_name):
print(class_name.__module__)
check_class_name(class_name=People) # __main__
check_class_name(class_name=Animal) # __main__
check_class_name(class_name=Cat) # new_class
# 查看当前实例所对应的类
def check_class_name(obj_name):
print(obj_name.__class__)
check_class_name(obj_name=People(name='serein',age=18)) # __main__
check_class_name(obj_name=Animal()) # __main__
check_class_name(obj_name=Cat()) # new_class
4.绑定方法、类方法、静态方法
- 绑定方法,默认有一个self参数,由对象进行调用(此时self就等于调用方法的这个对象)【对象&类均可调用】
- 类方法,默认有一个cls参数,用类或对象都可以调用(此时cls就等于调用方法的这个类)【对象&类均可调用】
- 静态方法,无默认参数,用类和对象都可以调用。【对象&类均可调用】
class Foo(object):
def __init__(self, name, age):
self.name = name
self.age = age
def f1(self):
print("绑定方法", self.name)
@classmethod
def f2(cls, name):
print("类方法", cls, name)
@staticmethod
def f3(name):
print("静态方法", name)
# 绑定方法(对象)
obj = Foo("serein", 20)
obj.f1() # Foo.f1(obj)
# 类方法
Foo.f2('serein') # cls就是当前调用这个方法的类。(类)cls = Foo
obj.f2('serein') # cls就是当前调用这个方法的对象的类。
# 静态方法
Foo.f3('serein') # 类执行执行方法(类)
obj.f3('serein') # 对象执行执行方法
5.总结
# 总结 : 绑定方法 与 非绑定方法
# 【一】概念上来说
# 绑定方法 : 就是绑定给某个目标(类或对象)的方法才叫绑定方法
# 非绑定方法:不绑定给某个目标(类或对象)的方法叫非绑定方法
# 【二】调用方式上来看
# 绑定给对象的方法:对象可以任意调用,类可能会受到某些限制
# 绑定给类的方法:类可以任意调用,对象可能会受到某些影响
# 非绑定方法:不受类和对象的限制,可以任意调用
# 【三】定义方式上来看
class Person():
# 【1】绑定给对象的方法:正常我们定义的所有方法都是绑定给对象的方法
# 在定义方法的时候,会自动补全 self
def read(self):
print(self)
# 【2】绑定给类的方法:用装饰器装饰我们想要绑定给类的方法
# 在定义方法的时候,会自动补全 cls
@classmethod
def write(cls):
print(cls)
# 【3】非绑定方法:既不绑定给对象也不绑定给类
# 在定义方法的时候,不会自动补全参数
@staticmethod
def run():
...
# 【四】三种函数的调用
# 【1】绑定给对象的方法
# (1)对象调用
p = Person()
p.read()
# (2)类调用,self的值就是实例化得到的对象
Person.read(Person())
# 【2】绑定给类的方法
# (1)类调用
Person.write()
# (2)对象调用
p = Person()
p.write()
# 【3】静态方法(非绑定方法)
# (1)对象调用
p = Person()
p.run()
# (2)类调用
Person.run()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)