cls与self的区别与联系
结论:A为类,地址与cls一样,a为实例化对象,地址与self一样 A()也为实例化对象它可以触发__init_方法
(__init_魔法方法通过类加()触发)
class A(object):
def sky(self):
print(id(self)) # 2839707071368
@classmethod
def person(cls):
return print(id(cls)) # 2839705905128
a = A()
print(id(a)) # 2839707071368
a.sky()
a.person()
print(id(A)) # 2839705905128
cls与self都是开辟实例化对象的空间
class A:
def __init__(self):
pass
def fun(self):
self.a = 1
print(self.__dict__)
# print(cls.__dict__)
print(A.__dict__)
def fuc(self):
self.b = 2
print(self.a)
print(self.b)
print(self.__dict__)
# print(cls.__dict__)
print(A.__dict__)
def func(cls):
cls.c=3
print(cls.c)
# print(self.__dict__)
print(cls.__dict__)
print(A.__dict__)
a=A()
a.fun()
a.fuc()
a.func()
A与A() 与 a =A() 的区别与联系
""" 实例对象调用 类调用 访问实例属性 访问类属性
实例方法 1 0 1 1
类方 法 1 1 / 1
静态方法 1 1 / 0
普通方法 0 1 / 0
https://blog.csdn.net/weixin_44259638/article/details/121318407
"""
class A(object):
nation = "china" # 类属性
def __init__(self): # 魔法方法 对实例化对象封装属性
self.province = "四川" # 实例属性
# 1.实例方法 实例调用
def sky(self):
name = "phil"
# return print(self.province)
# print(id(self))
print("我是实例方法返回")
# 2.静态方法 不需要参数 类和实例方法都可以调用
@staticmethod
def land():
age = 18
# return print(nation)
# return print(self.province)
print("我是静态方法返回")
# 3.类方法 类和实例方法都可以调用
@classmethod
def person(cls):
cls.sex = "male" # 这是类属性
return print(cls.nation)
# return print(id(cls))
# print("我是类方法返回")
# 4.普通方法quti
def normal():
print("我是普通方法返回")
# print()1
# 实例化方法 普通方法不能调用 访问属性时先访问时,先访问实例属性访问类属性
a = A()
# a.sky() # 结果: 我是实例方法返回
# a.land() # 结果: 我是静态方法返回
a.person() # 结果: 我是类方法返回
# a.normal() # 运行报错 因为普通方法需要self 参数
# 类调用 实例方法不可调用
# A.sky() # 运行实例方法出错
# A.land() # 结果: 我是静态方法返回
# A.person() # 结果: 我是类方法返回
# A.normal() # 结果: 我是普通方法返回
# print(A.province) 不能访问实例属性
# A() 普通方法不能调用
# A().person() # 1
# A().land() # 1
# A().sky() # 1
# A().normal() # 0
# print(A().province) # 四川 可以访问实例属性 可以把它当作实例化
# a = A()
# print(id(a))
# a.sky()
# a.person()
# print(a.__dict__)
实例空间与类空间的区别与联系
class Test:
a = 1
def test(self):
print(self.a) # 在实例空间的属性中找不到a,就去类空间找,找到了为 1
self.a += 2 # 在实例空间创建a属性,初始值为 3
print(self.a) # 实例空间找到了a属性为 3
print(Test.a) # 1 类属性a为1
b = Test()
b.test() # 1 3
print(b.a) # 3 实例空间找到了a属性为 3
print(Test.a) # 类空间的 a 还是 1