python基础 类(一)

一 定义类并创建实例对象

1 定义一个简单的类

class Something():
    i = 0

    def get(self):
        return

如上,就创建了一个类对象,同时也创建了一个局部作用域,类里面的变量、函数都包含在这个作用域内

2 类对象

类对象支持两种操作:属性引用和实例化

属性包括定义在类中的变量和函数,对属性的引用形式就是标准的 object.attribute_name的形式(注意object后有个点)
如对刚才创建的类 Something.get和Something.i 就是属性引用

print(Something.get,end='\n\n')
print(Something.i)

执行结果 输出一个函数和数字 0
image

类的实例化很像是函数的执行方式 如

s = Something()
# 上面创建一个该类的实例对象,并把该对象赋值给变量s,也就是s指向了实例对象

3 实例对象

实例对象用来进行属性引用,与类对象一样,属性包括变量和函数

对于变量,实例对象可以引用类里面定义的变量,也可以自己定义新的变量

s.a = s.i + 1
print(s.a)
del s.a
print(s.a)

如上,定义了s.a后又删除了该变量,执行结果
image

对于函数,其实对于实例对象来说,这里叫方法更合适,方法就是属于对象的函数,类中定义了哪些函数,实例对象就能访问哪些方法

#对方法的调用就和函数一样
s.get()
# 也可像函数一样把方法赋值给另一个变量
my_get = s.get
my_get()

可能不太准确的讲,就把方法看作函数也没有问题

需要注意的是,在类中定义函数f的时候,函数第一个参数是self,上面调用方法(函数)的时候的并没有提供这个参数,按照以前函数的理解这样是会报错的,这可能就是实例对象的方法与函数的唯一区别

实际上,self指的是创建的实例对象本身,在调用方法(函数)时,实例对象作为第一个参数被自动传入了,执行s.f()就相当于执行Something.f(s)

4 更常见的定义类的方式

通常把一些数据属性即变量定义在__init__函数中,该函数会在创建实例对象时自动调用,这样在实例对象创建完之后,数据就被自动赋予了初始值
如上面的代码改写为

class Teacher():
    def __init__(self, name):
	#和self关联的数据属性为实例对象的数据属性
        self.name = name

    def get_name(self):
        print(f"teachers name:{self.name}",end='\n\n')
# 构造函数有name参数,创建实例对时要传入这个参数
t1 = Teacher('b')
print(f'实例对象t: {t1}',end='\n\n')
print(f"类techer: {Teacher}",end='\n\n')
t1.get_name()

t2 = Teacher('b')
print(f'实例对象t: {t2}',end='\n\n')
print(f"类techer: {Teacher}",end='\n\n')
t1.get_name()

执行结果
image

注意,构造函数的第一个参数必须是self,表示创建的实例对象本身,后面可跟上各种自定义参数,有这些自定义参数时,创建实例对象的时候就必须传入这些参数

可以看到,变量t是一个对象,该对象位于计算机0x00那一个内存地址中。同个类的每个实例对象的内存地址都是不同的,每个实例对象都是独立的,和实例对象相关联的方法和数据属性都是该实例对象所独有的,一个实例对象数据属性的改动不会影响其它实例对象

5 类与对象

类是模板、规范,类定义成什么样子,决定了根据它创建的实例对象生下来就是什么样子,各个实例对象创建好后,实例对象独立拥有类中定义的数据属性和函数(和self关联的数据和函数),未与self关联的数据属性和函数虽然归属于类,各个实例对象依然可以访问和修改,只不过这时是共享而不是独有的(后面再介绍)

通俗的说,类与对象有点象建筑施工图纸和建筑的关系,图纸在逻辑上明确了建筑长什么样子、有多高、有多宽、哪里是楼梯、哪里是电梯,但此时建筑并不存在于我们的现实世界。等建筑真正建造出来,建筑才真的存在现实世界中,但图纸却决定建筑了完工时到底是什么样子

所以,为什么叫创建实例对象,因为计算机确实开辟出了一个新的地址用来存放一个新建立的对象,之前该对象是不存在的,现在该对象是活生生的的存在于计算机内存中

二 类与实例对象的数据属性

可以将类中定义的变量看作数据属性(可能不准确,但不影响理解)
数据属性有类属性和实例对象属性,通过self定义的是实例对象属性,否则是类属性

class Student:
#count为类的变量即类属性
    count = 0
    def __init__(self, name):
	#通过self定义的变量为实例变量即实例属性
        self.name = name
        Student.count = Student.count + 1
    def get_count(self):
        print(f'Student.count: {Student.count}')
	def get_name(self):
        print(f'name:{self.name}')

s1 = Student('a')
s1.get_count()
s2 = Student('b')
s2.get_count()

执行结果
image
以上可知,实例属性数据独属于各个实例对象,而类属性则是各个实例对象共享

类属性也可以通过实例对象.变量名的形式来访问,如上面的count,就通过s1.count的形式,但是如果有同名的实例属性的话读取到的就是实例属性数据了,因为同名的实例属性优先于类属性

实际上,当对实例对象进行属性引用时(包括变量数据和函数),如果该属性在实例中无法找到,将搜索实例所属的类,如果被引用的属性名称表示一个有效的类属性中的函数对象,会打包两者(实例对象和查找到的函数对象)的指针到一个抽象对象,这个抽象对象就是方法对象。基于调用方法对象所提供的参数(即实例对象调用方法时那些无slef的参数),会实例对象和参数列表构建一个新的参数列表,并用这个新参数列表调用相应的函数对象

posted @   工作手记  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示