【python】python的面相对象的知识
python面相对象知识
一丶类的定义
class student: #类的声明 def read(self,value): #类的方法的定义 print(value) def study(self,value): #类的方法的定义 pass
二丶类的成员方法的调用
class student: #类的声明 def read(self,value): #类的方法的定义 print(value) def study(self,value): #类的方法的定义 pass stu=student()#实例化一个student类的对象 stu.read("瓜嘎嘎嘎")#结果为:瓜嘎嘎嘎 #上面代码通过对象stu去调用类的方法read()
三丶为对象添加普通属性
class student: #类的声明 def setread(self,value): self.readbook=value#给这个对象定义一个名为readbook属性,并且把value参数赋值给它 #上面代码中的self代表的是调用这个方法的对象,value则代表是传给这个方法的参数 #注意self是python自动传过来的,所以我们不必理会 def read(self): #类的方法的定义 print(self.readbook)#调用这个对象的普通属性 def study(self,value): #类的方法的定义 pass stu=student() stu.setread("瓜嘎嘎嘎") stu.read()#结果为:瓜嘎嘎嘎
四丶类的构造方法和析构方法
class student: #类的声明 def __init__(self,value): self.value=value print("我是%s的构造方法,当实例化对象的时候就会触发我"%(value)) def __del__(self): print("我是%s的析构方法,当对象给销毁的时候就会调用我"%(self.value)) def setread(self,value): self.readbook=value #上面代码中的self代表的是调用这个方法的对象,value则代表是传给这个方法的参数 #注意self是python自动传过来的,所以我们不必理会 def read(self): #类的方法的定义 print(self.readbook)#调用这个对象的普通属性 def study(self,value): #类的方法的定义 pass stu=student("stu")#这是实例化stu对象,所以类中的构造方法(__init__())方法就会自动执行 stu=0#这是销毁这个对象,当一个对象没有东西指向它的时候,它就会像垃圾一样给销毁,所以就会触发析构方法(__del__) badstu=student("badstu")#这是实例化badstu对象,所以类中的构造方法(__init__())方法就会自动执行 #注意当所有代码都执行完的时候,所有的变量或对象就被当作垃圾被销毁,所以类中的析构方法(__del__)就会被触发 #上面的代码的结果如下: # 我是stu的构造方法,当实例化对象的时候就会触发我 # 我是stu的析构方法,当对象给销毁的时候就会调用我 # 我是badstu的构造方法,当实例化对象的时候就会触发我 # 我是badstu的析构方法,当对象给销毁的时候就会调用我
五丶类的静态属性和静态方法的的声明
class person(): name="丰"#这是静态属性的声明 age=22#这是静态属性的声明 @staticmethod def myfunc():#通过@staticmethod修饰器来声明类的静态方法 print("我是静态方法") person.myfunc()#通过类来调用静态方法,当然在python也可以通过对象来调用静态方法,但是不建议这么做 print(person.name)#通过类来调用静态属性 print(person.age)#通过类来调用静态属性
六丶类的继承
class A(): def a(self): print("a") class D(): def d(self): print("d") class B(A):#这种形式就是B类继承A类,这是单继承 def b(self): print("b") class C(A,D):#这种形式就是C类继承A类和D类,这是多继承,python支持多继承 def c(self): print("c") b=B(); b.a(); c=C(); c.d(); 总结: 当子类继承父类的时候,子类的实例化对象可以调用父类的方法 如果子类和父类有同名方法,会优先调用自己的方法 如果继承类的集合中有同名方法,优先调用的顺序如下图的数字排列: 父类 父类 ┃ ┃
3.然后优先左边父类│ │5.然后是右边父类 子类 子类 │ │ ━━━━┳━━━━ 2.优先左边子类 │4.再到右边子类 ┃ 1.最优先的是自己 由上图可以看出 继承类的集合中有同名方法,优先调用顺序为(自己,左,右)
七丶子类中如何调用父类构造方法的
方式一:直接通过用父类的名称调用父类的构造方法 class A(): def __init__(self):#声明构造方法 self.name="feng" def a(self): print("a") class B(A):#这种形式就是B类继承A类,这是单继承 def __init__(self): A.__init__(self)#直接用父类的名称调用父类的构造方法 self.age=10 def b(self): print("b") 方式二: 通过调用super()函数来实习 class A(): def __init__(self):#声明构造方法 self.name="feng" print(self.name) def a(self): print("a") class B(A):#这种形式就是B类继承A类,这是单继承 def __init__(self): super(B,self).__init__()#使用super()调用父类的构造方法 self.age=10 print(self.age) def b(self): print("b") b=B();#结果为: # feng # 10 方法一更直观,方法二可以一次初始化所有超类 super函数比在超累中直接调用未绑定方法更直观,但是其最大的有点是如果子类继承了多个父类,它只需要使用一次super函数就可以。然而如果没有这个需求,直接使用A.__init__(self)更直观一些。
八丶类的特殊成员方法
#1,类的特殊成员__doc__ # class A(): # '我是类A' #类的帮助信息 # def __init__(self):#声明构造方法 # self.name="feng" # print(self.name) # def a(self): # print("a") # #类的帮助信息可以通过ClassName.__doc__查看 # print(A.__doc__) # #结果为:我是类A #2,类的特殊成员__module__ # class A(): # def __init__(self):#声明构造方法 # self.name="feng" # print(self.name) # def a(self): # print("a") #__module__表示当前操作的对象所在的模块 #print("module:",A.__module__) #结果为: #module: __main__ # 3,类的特殊成员__dict__ # class A(): # attr="I,m is attribute" # def __init__(self):#声明构造方法 # self.name="feng" # print(self.name) # def a(self): # print("a") #__dict__ : 类的属性(包含一个字典,由类的数据属性组成) # print(A.__dict__) # 结果为: # {'__module__': '__main__', # 'attr': 'I,m is attribute', # '__init__': <function A.__init__ at 0x00000000023EB8C8>, # 'a': <function A.a at 0x00000000023EB950>, # '__dict__': <attribute '__dict__' of 'A' objects>, # '__weakref__': <attribute '__weakref__' of 'A' objects>, # '__doc__': None} #4,类的特殊成员__str__ # class A(): # attr="I,m is attribute" # def __init__(self):#声明构造方法 # self.name="feng" # def a(self): # print("a") # def __str__(self): # return "打印时触发" # a=A() #当把对象当成字符串打印的时候就会触发__str__ # print(a) #结果为: #打印时触发
#5,类的特殊成员__call__ #把对象当成一个方法来使用的时候就会触发这个歌方法__call__ class A(): attr="I,m is attribute" def __init__(self):#声明构造方法 self.name="feng" def a(self): print("a") def __call__(self): print("我被调用了") a=A(); a();#把对象当成了一个方法来调用 # 结果为: # 我被调用了
# 6,__class__表示当前操作的对象所属的类 class A(): attr="I,m is attribute" def __init__(self):#声明构造方法 self.name="feng" def a(self): print("a") def __call__(self): print("我的类是",self.__class__) a=A(); a(); # 结果为: # 我的类是 <class '__main__.A'>
#7,__getitem__和__setitem__ #把对象当成字典来设置值就会触发类中的__setitem__方法 #把对象当成字典来获取值就会触发类中的__getitem__方法 class test: kk = {}; def __getitem__(self, key): return self.kk[key]; def __setitem__(self, key, value): self.kk[key] = value; print("我被调用") t=test() t[0]="feng"#把对象当成字典来设置值就会触发类中的__setitem__方法 t[1]="ying"#把对象当成字典来设置值用就会触发类中的__setitem__方法 print(t[0])#把对象当成字典来获取值就会触发类中的__getitem__方法 print(t[1])#把对象当成字典来获取值就会触发类中的__getitem__方法 # 上面代码输出如下结果: # 我被调用 # 我被调用 # feng # ying
# 8,__delitem__ #把对象当成字典用del删除对象字典的成员就会触发__delitem__ class test: kk = {}; def __getitem__(self, key): return self.kk[key]; def __setitem__(self, key, value): self.kk[key] = value; def __delitem__(self,key): print("我被调用",self.kk[key],"将被删除") del self.kk[key] t=test() t[0]="feng" t[1]="ying" del t[0] #结果为: #我被调用 feng 将被删除
九丶类的访问修饰符
类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs。
类的方法
在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用self.__private_methods
Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName 访问属性
class JustCounter(): __secretCount = 0 # 私有变量,只能再类的内部进行访问 publicCount = 0 # 公开变量,可以在任何地方访问 _pro=11 #protected 类型的变量 def count(self): self.__secretCount += 1 self.publicCount += 1 print (self.__secretCount) class child(JustCounter): def a(self): print(self._pro); j=JustCounter() print(j.__secretCount)#直接访问私有变量,直接报错 #如果硬要访问私有变量可以用如下方法 print(j._JustCounter__secretCount)
单下划线、双下划线、头尾双下划线说明:
-
__foo__: 定义的是特列方法,类似 __init__() 之类的。
-
_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于from module import *
-
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
十丶类的装饰器
@classmethod #定义类方法的装饰器 @staticmethod #定义静态方法的装饰器 @property #将方法变成属性可以不加()直接访问方法的装饰器 @设置了property的方法名.setter #可以设置property的方法 class zhuanshiqi(): age=22 @classmethod def a(self):#类方法没有对象self,这个self是类 print(self) @staticmethod def b():#静态方法是类调用的,没有self print("静态方法") @property def c(self): return self.age @c.setter def c(self,value): self.age=value def d(self): print(self) z=zhuanshiqi() z.a()#结果为:<class '__main__.zhuanshiqi'> z.d()#结果为:<__main__.zhuanshiqi object at 0x0000000001EAA908> zhuanshiqi.b()#结果为:静态方法 print(z.c)#不用加(),直接调用c()方法,结果为:22 z.c="20"#调用setter装饰器的c方法,把age设置为20 print(z.c)#结果为20

浙公网安备 33010602011771号