class A(B): #A类继承B类,A是子类,B是父类
'''类的说明性文字可以写在这里'''
count=0 #类变量、全局变量
_ass=25 #单下划线开头的变量,在其他文件同通过fromt A import * 的方式导入该模块时,不能直接调用_ass=25;可通过import A的方式导入模块,用A._ass方式调用
__slots__=('name','age') #变量限定功能,表示该类中只允许使用这两个变量,防止使用其他变量
def __init__(self,name,age): #初始化A类的属性,子类未定义该方法时,会自动初始化父类的属性;子类定义了该方法时,不会自动初始化父类的属性,需要自己加入初始化父类的调用,例如:B.__init__(self,country,sex)
B.__init__(self,country,sex) #初始化父类的属性,如果父类中有参数,则必须初始化父类的属性
self.name=name #实例变量,可以用‘实例名.变量名’调用,也可以通过方法‘实例名.get_变量名()’调用
self.__age=age #实例私有变量,不可以用‘实例名.变量名’调用,能通过方法‘实例名.get_变量名()’调用(也可用‘实例名._类名__变量名’调用,不推荐),好处是防止外部直接通过'实例名.age=值'来进行赋值,容易产生脏数据
def a(self): #实例方法,参数中必须含self,只能被实例调用;调用该方法时,系统会自动将实例的地址传入self
global count #使用全局变量的方法
count+=1
id='123' #局部变量
return id
def get_name(self,name): #获取实例变量的方法
return self.name
def set_name(self,name): #修改实例变量的方法
self.name=name
def __get_age(self): #私有方法,无法通过'实例名.私有方法名()'调用,可在本类中其他方法中被调用,不想被外面调用该方法时可用私有方法
return self.__age
def __call__(self): #该方法为实例调用,只能通过'实例名()'来调用该方法
return 300
def __len__(self): #调用该方法时可获得400,通过'len(实例名)'调用
return 400
def __add__(self,other): #该方法可直接将两个实例相加得到一个值,例如:a1=A(100),a2=A(200),a3=a1+a2,那么a3=300
return self.age+other.age
@classmethod
def b(cls): #该方法上方加了@classmethod装饰器的,叫类方法;可以A.b()调用,也可以用实例调用;调用该方法时,系统会自动将本类的地址传入cls
print(cls.__name__) #该方法一般用于获取类本身的一些属性,该处打印的值为A
return 20 #该方法至少要有一个参数,一般叫cls,也可叫其他名字,该方法内不能使用实例变量
@staticmethod
def c(): #该方法上方加了@staticmethod装饰器的,叫静态方法;可以没有参数
return 30 #该方法可以A.b()调用,也可以用实例调用。该方法内不能使用实例变量
@property
def d(self): #类的属性,定义时上方需加@property装饰器,只能设置一个参数self,调用该方法时不用加括号‘实例名.d’
return self.__age
@d.setter
def d(self,value): #修改类的属性,定义时上方加‘@属性名.setter’,调用时“实例名.d=20”,就可将age的值改为20
if value<0 or value>100:
return "年龄超过范围"
self.__age=value
@d.deleter
def d(self): #删除类的属性,定义时上方加“@属性名.deleter”,调用时“del 实例名.d”,就可将age删除
del self.__age
#区别----用类的属性操作变量:实例名.属性名='某个值';用“set_变量名()”操作变量:实例名.set_变量名('某个值')
#用函数的方式实现实现变量的增删改查
getattr(实例名,"变量名",100) #100表示默认值,代表未找到变量返回100
hasattr(实例名,"变量名") #变量存在返回True,变量不存在,返回False
setattr(实例名,"变量名",200) #将变量的值修改为200
delattr(实例名,"变量名") #删除变量
#内置属性的用法
实例名.__dict__ #可将获取实例中的属性:{'name': '值', '_A__age': 值}
实例名.__doc__ #可获取类中说明性文字:'类的说明性文字可以写在这里'
类名.__name__ #获取类的名字:'A'
实例名.__module__ #获取所在模块的名字:'__main__'
类名.__bases__ #获取该类的所有父类,返回元组:(<class 'object'>,)
#单例的实例化,类只能进行一次实例化的方法
class A():
_instance = None #类变量,该变量为None时,表示未被实例化过
def __new__(cls,*args,**kw): #cls代表将A类传入cls参数中,*args和**kw可变参数是为了A类中有多个属性时传入,给__new__()进行实例化用;a1=A(100,200,300),这种方法传参时会传入*args中,a2=A(x=100,y=200),这种方法传参时会传入**kw中
if cls._instance is None: #表示当类未被实例化时,执行以下代码进行实例化;如果不是Nnoe,则不进行实例化,_instance的值不变
cls._instance=object.__new__(cls) #进行实例化
return cls._instance #将实例化对象返回
#该类只能实例化一次,例如:a1=A(),a2=A(),那么id(a1)==id(a2),即a1和a2是同一个实例
#闭包
def add(a,b):
return a+b
def w():
return add
x=w()(1,2) #x的值为3;w()等价于add,后面加上(1,2),就等价于add(1,2)
def p():
a=1
def x():
return a
return x
p()() #返回a的值1,该处调用x()的同时,也会调用x()外的变量
#方法重写:将父类的方法在子类中重新实现,调用时会自动调用子类重写的方法