第四章 面向对象

第四章 面向对象

  1. 基本格式

    定义:当函数(业务功能)比较多,可以使用面向对象来进行归类,如果有一个凡事使用的公共值,也可以放到对象中

#格式&关键字
class 类名:
    def __inti__(self,x)
        self.x = x
    def 方法名(self,name):
        print(self.name)
v1 = 类(666)
v1.方法('Parallel')

#存储一些值,方便之后使用
clas Foo:
    def __intit__(self,n,a,g):
        self.name = n
        self.age = a
        self.gender = g
    def show(self):
        temp = '我是%s,年龄%s,性别%s'%(self.name,self.age,self.gender,)
        print(temp)
p = Person('Parallrl',18,'')    #类()实例化对象,自动执行此类中的__init__方法
p.show()

  2. 三大特性

    2.1 封装

      定义:将同一类的函数或重复使用的公共值封装佛奥同一个类中,方便以后使用

    2.2 继承

      定义:创建一个子类的对象,执行对象.方法时,优先在自己的类中找,如果没有就在父类中找,多个类中如果有公共的方法,可以放在基类中

      注:继承关系的查找顺序,要注意self到底是哪个类创建的,就从此类开始找

#继承
class Base:    父类(基类)
    def f1(self):
        pass
class Foo(Base):    子类(派生类)
    def f2(self):
        pass
obj = Foo()  

  3. 类成员

    方法(绑定方法/普通方法):至少有一个self参数,先创建对象,由对象.方法()执行

    类方法:@classmethod,至少有一个参数cls,类.类方法()执行

    静态方法:@staticmethod,参数无限制可以不传参,可以不创建对象类.静态方法名()执行

    类变量:写在类的下一级,和方法同级,类/对象.类变量名称调用

    属性:@property,把方法编程属性,出去了self不能有其他参数,用对象.属性名调用,不需要加()

  4. 成员修饰符

    定义:公有&私有

#公有变量和私有变量    
class Foo:
    def __init__(self,name):
        self.name = name    #公共的
        self._name = name    #私有的
    def func(self):
        print(self,name)
obj = Foo('alex')
print(obj.name)
print(obj.__name)    #外部访问不到

#访问私有变量
class Foo:
    def __init__(self,name):
        self.__x = name
obj = Foo('alex')
print(obj._Foo__x)    #强制访问私有实例变量

  5. 特殊成员

#__init__:初始化方法,用于给对象赋值(默认执行)

#__new__:构造空对象,比__inti__优先执行

#__call__:可以用类()()直接执行call方法

#__getitem__/__setitem__/__delitem__
class Foo:
    def __setitem__(self,key,value):
        print(key,value)
    def __getitem__(self,item):
        print(item)###xxx
    def __delitem__(self,key):
        print(key)###ttt
obj1 = Foo()
obj1['k1'] = 123#内部会自动调用__setitem__方法
val = obj1['xxx']    #内部会自动调用__getitem__方法
print(val)
del obj1['ttt']#内部会自动调用__delitem__方法

#__str__:打印一个对象,当__str__返回什么,对象就打印什么
class Foo(object):
    def __str__(self):
        return 'sdsdsa'
obj = Foo()
print(obj)    #打印的是对象,类型也是对象,但答应出来的是sdsdsa

#__dict__:将要找的元素编程字典格式
class Foo(object):
    def __init__(self,name,age,email):
        self.name = name
        swf.age = age
        self.email = email
obj = Foo('alex',19,'xxx@qq.com')
val = obj.__dice__#去对象中找到所有变量转换为字典
print(val)    #{'name':'alex','age':19}

#__enter__/__exit__:文件上下文管理
class Foo(object):
    def __enter__(self):
        self.x = open('a.txt',mode='a',encoding='utf-8')
        return self.x
    def __exit__(self,exc_type,exc_val,exc_tb):
        self.x.close()
with Foo() as ff:
    ff.write('alex')

#对象互相加减乘除    
class Foo(object):
    def __add__(self,other):
        pass
obj1 = Foo()
obj2 = Foo()
val = obj1 +obj2###触发add,前面触发,前面为self,后面为other

  6. 嵌套

    定义:面向对象可以当参数嵌套到函数中,类(Foo)可以为key对象(obj)可以做key

class Dream(object):
    def __init__(self,title,addr):
        self.title = title
        self.address = addr
        
class House(object):
    def __init__(self,name,dream_object):
        self.name = name
        self.dream =dream_object
        
s1 = Dream('北京','沙河')
s2 = Dream('上海','浦东')
s3 = Dream('深圳','南山')

c1 = House('Parallel',s1)
c1.name
c1.dream.title
c1.dream.address

  7. 反射

#根据字符串的形式去某个对象中操作他的成员
class Foo:
    def login(self):
        pass
obj = Foo()
func_name = input('请输入方法名:')
getattr(obj,func_name)()    #找到方法并执行

#根据字符串的形式去某个对象中判断是否有该成员
class View(object):
    def login(self):
        return '登陆'
    def logout(self):
        return '登出'
    def index(self):
        return '首页'
obj = View()
func_name = input('请输入方法名:')
if not hasattr(obj,func_name):
    print('输入错误')
getattr(obj,func_name)()

#根据字符串的形式去某个对象中设置成员
class Foo:
    pass
obj = Foo()
setattr(obj,'k1','123')    #obj.k1 = '123'    #设置对象成员
print(obj.k1)

#根据字符串的形式去某个对象中删除成员
class Foo:
    k1 = 999
obj = Foo()
delattr(obj,'k1')

  8. 内置函数

    issubclass:判断某个类是否是某个类的子类  print(issubclass(子类,父类))  返回布尔值

    isinstance:判断对象是否是某个类或该类基类的实例  print(isinstance(obj,Foo))  判断obj是否是Foo或Foo基类的实例  返回布尔值

    super:根据self对象所属类的继承关系,按顺序挨个找并执行,默认找到第一个就不找了  v = super().xx()

  9. 单例模式

    定义:无论实例化多少次,都是用第一次创建的那个对象

class Foo(Object):
    instance = None
    def __new__(cls,*args,**kwargs):
        if not instance:
            cls.instance = object.supper().__new__(cls)
        return cls.instance
obj1 = Foo()
obj2 = Foo()    #不管启动多少个Foo内存地址都指向obj1
posted @ 2019-05-25 10:51  现实没有如果  阅读(186)  评论(0编辑  收藏  举报