大学生个人网站怎么做,那些网站做的非常好看,数字营销理论,旅行社ota平台运营做些什么1. 类对象和实例对象
Python中一切皆对象#xff0c;Python类本身也是一种对象#xff0c;类定义完成后#xff0c;会在当前作用域中定义一个以类名为名字的命名空间。类对象具有以下两种操作#xff1a;
可以通过“类名()”的方式实例化一个对象。
可以通过“类名.类属性”…1. 类对象和实例对象
Python中一切皆对象Python类本身也是一种对象类定义完成后会在当前作用域中定义一个以类名为名字的命名空间。类对象具有以下两种操作
可以通过“类名()”的方式实例化一个对象。
可以通过“类名.类属性”的方式来访问一个类属性。
如果说类时一种概念性的定义是一种类别那么实例对象就是对这一类别的具体化、实例化即实例化对象是类对象实例化之后的产物。
class Person:#声明一个类对象
passp1 Person()#声明一个实例对象
print(Person)#输出结果
print(p1)#__main__.Person object at 0x0000015F7F94D0F0
2 类变量与实例变量
2.1 概念上的区别
类变量是指是指该类的所有实例说共有的数据实例变量是该类每一个实例所特有的数据。这么说的话可能还是很抽象我们拿人类Person类来打比方人类能移动moveTrue这是每一个人张三、李四都能做的所以我们可以说人类能移动张三能移动李四也能移动这里的移动move就是一个类变量。但每一个人都可能有不同的姓名name和年龄age张三可能20岁李四可能30岁但是我们不能说人类Person都是20岁或30岁这里的姓名name和年龄age就是实例变量。
classPerson:
move True #这是类变量
def __init__(self , name , age):
self.name name #这是实例变量
self.age age #这是实例变量
2.2 声明上的区别
类变量声明通常在类内部但函数体外不需要用任何关键字修饰。实例变量一般声明在实例方法内部其他方法内部也不行且用self关键字修饰。
classPerson:
move True #这是类变量
def __init__(self , name):
self.name name #这是实例变量必须声明在实例函数内用self关键字修饰
#move True # 类变量不能再函数体内声明在这个位置声明的又没有self关键字修饰只能是一个局部变量
#self.age age # 这是错误的实例变量不能再这里声明
eat True #这是类变量可以在函数体外类内部任意位置
上面的变量绑定都是在对象声明过程中绑定的但事实上类变量和实例变量都可以在类或者实例都可以在对象声明结束之后再绑定。“类名.变量名”绑定的是类变量“实例名.变量名”绑定的是实例变量。
classPerson:
moveTruedef __init__(self , name , age):
self.namename
self.ageage
p1 Person(张三 , 20)
p1.gender男 #声明实例对象结束之后再绑定一个实例变量
Person.eat True #声明类对象结束之后再绑定一个类变量
print(p1.gender) #输出结果男
print(p1.eat) #输出结果True
注虽然可以在对象声明之后再绑定对象但是这种方式最好不要使用。
2.3 访问上的区别
类变量可以通过“类名.变量名”和“实例名.变量名”的方式访问。实例变量只能通过“实例名.变量名”的方式来访问。
classPerson:
move True #这是类变量
def __init__(self , name , age):
self.name name #这是实例变量
self.age age #这是实例变量
p1 Person(张三 , 20)print(p1.name , p1.age) #通过“实例名.变量名”的方式访问实例变量
print(p1.move) #通过“实例名.变量名”的方式访问实例变量
print(Person.move) #通过“类名.变量名”方式访问类变量
#print(Person.name) # 这是错误的
注虽然可以通过“实例名.类变量名”的方式访问类变量但是并不推荐最好还是通过“类名.类变量名”来访问类变量。
2.4 存储上的区别
类变量只会在用class关键字声明一个类时创建且也只会保存在类的命名空间中这个类的实例的命名空间中是没有的。通过“实例名.类变量名”访问类变量时实际访问的是类命名空间中数据所以所有实例访问到的数据都是同一个变量。实例变量保存在实例各自的命名空间中。
classPerson:
move True #这是类变量
def __init__(self , name , age):
self.name name #这是实例变量
self.age age #这是实例变量
p1 Person(张三 , 20)
p2 Person(李四 , 30)#通过id()函数查询move内存地址
print(id(p1.move)) #输出结果为1622667424
print(id(p1.move)) #输出结果为1622667424
3 静态方法、类方法、实例方法
3.1 静态方法
静态方法是指在定义时使用staticmethod装饰器来修饰无序传入self或cls关键字即可进行创建的方法。在调用过程时无需将类实例化直接通过“类名.方法名”方式调用方法。当然也可以在实例化后通过“实例名.方法名”的方式调用。在静态方法内部只能通过“类名.类变量名”的方式访问类变量。
classPerson:
moveTruedef __init__(self , name , age):
self.namename
self.ageage
staticmethoddef static_fun(): #声明一个静态方法
print(Person.move)
p1 Person(张三 , 20)
p1.static_fun()#输出结果这是静态方法
Person.static_fun()#输出结果这是静态方法
3.2 类方法
类方法需要使用classmethod装饰器来修饰且传入的第一个参数为cls指代的是类本身。类方法在调用方式上与静态方法相似即可以通过“类名.方法名”和“实例名.方法名”两种方式调用。但类方法与静态方法不同的是类方法可以在方法内部通过cls关键字访问类变量。在类方法内部既能通过“类名.类变量名”的方式访问类变量也能通过“cls.类变量名”的方式访问类变量。
classPerson:
moveTruedef __init__(self , name , age):
self.namename
self.ageage
classmethoddef class_fun(cls): #声明一个类方法
print(cls.move)print(Person.move)#cls 指的就是Person类等效
p1 Person(张三 , 20)
p1.class_fun()#输出结果True True
Person.class_fun()#输出结果True True
3.3 实例方法
在一个类中除了静态方法和类方法之外就是实例方法了实例方法不需要装饰器修饰不过在声明时传入的第一个参数必须为selfself指代的就是实例本身。实例方法能访问实例变量静态方法和类方法则不能。在实例方法内部只能通过“类名.类变量名”的方式访问类变量。在调用时实例方法可以通过“实例名.实例方法名”来调用如果要通过类来调用必须必须显式地将实例当做参数传入。
classPerson:
moveTruedef __init__(self , name , age):
self.namename
self.ageagedef instance_fun(self): #声明一个实例方法
print(Person.move) #访问类变量
print(self.name , self.age)
p1 Person(张三 , 20)
p1.instance_fun()
Person.instance_fun(p1)#通过类访问实例方法时必须显式地将实例当做参数传入