【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

 

posted @ 2017-06-21 18:03  丰study  阅读(336)  评论(0)    收藏  举报