Python基础-面向对象2

一、成员修饰符
共有成员
私有成员:创建方式在成员之前加两个下划线,私有成员无法直接访问,只能间接访问
子类不能继承父类的私有属相
私有普通字段的访问方式:
class Fansik:
    def __init__(self, name, age):
        self.name = name
        self.__age = age
    def show(self):
        return self.__age
obj = Fansik('fanjinbao', 12)
print(obj.name)
print(obj.show())
私有静态字段的访问方式:
class Fansik:
    __name = 'fanjinbao'
    @staticmethod
    def state():
        return Fansik.__name
print(Fansik.state())
或者
class Fansik:
    __name = 'fanjinbao'
    def show(self):
        return Fansik.__name
obj = Fansik()
print(obj.show())
私有方法的访问方式:
class Fansik:
    def __state(self):
        return 123
    def show(self):
        return self.__state()
obj = Fansik()
print(obj.show())
二、特殊成员
__init__ 类()自动执行
__call__ 对象() 类()()自动执行
__int__ init(对象)
__str__ str(对象)
__dict__ 将对象中封装的所有内容通过字典的形式返回(包含注释)
__add__ 两个对象相加时,自动执行第一个对象的__add__方法,并且将第二个对象当做参数传递进入
__del__ 析构方法,对象销毁时自动执行
__iter__
class Fansik:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __iter__(self):
        return iter([11, 22, 33])
li = Fansik('fansik', 19)
for i in li:
    print(i)
如果类中有__iter__方法,那创建出来的对象-->就是可迭代对象
可迭代对象.__iter__()的返回值,是一个迭代器
for循环遇到的迭代器,使用next
for循环遇到可迭代对象,通过对象.__iter__()获取迭代器,使用next
执行li对象的类Fansik中的__iter__方法,并获取其返回值
循环上一步中返回的对象
class Fansik:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __setitem__(self, key, value):
        print(key, value)
    def __getitem__(self, item):    # 切片(slice类型)或者是索引
        return item + 100
    def __delitem__(self, key):
        print(key)
li = Fansik('fanjinbao', 19)
li[100] = 'zhansan'
print(li[100])
del li[100]
三、metaclass,原始类
Python中一切事物都是对象
class Fansik:
pass
obj = Fansik()
obj是对象,Fansik类
Fansik类是type的对象
类都是type类的对象,type(...)
"对象"都是以类的对象, 类()
class Fansik:
    def func(self):
        print('123')
或者使用下面的方法声明一个类
def function(self):
    print('123')
Fansik = type('Fansik', (object,), {'func': function})
或者
Fansik = type('Fansik', (object,), {'func': lambda x: 123})
执行构造方法之前的需要执行的操作
class MyType(type):
    def __init__(self, *args, **kwargs):
        print(123)
        pass
    def __call__(self, *args, **kwargs):
        print('456')

class Fansik(object, metaclass=MyType):
    def __init__(self):
        pass
    def __new__(cls, *args, **kwargs):
        pass
    def func(self):
        print('hello world!!!')

obj = Fansik()
在obj被创建之前先执行MyType中的__call__方法,__call__中的self是Fansik
obj是在__new__中被创建的
四、异常处理
try:
    name = input('please enter your name : ')
    i = int(name)
except IndexError as e:
    print('IndexError')
except ValueError as e:
    print('ValueError')
except Exception as e:
    print('Exception')
else:
    print('else')
finally:
    print('finally')
1、如果输入错误则执行ValueError、finally
2、如果输入正确则执行else、finally

自定义异常和主动触发异常
# 自定义异常
class Fansik(Exception):
    def __init__(self, msg):
        self.message = msg
    def __str__(self):
        return self.message
try:
    # 主动触发异常
    raise Exception('fansik error...')
except Exception as e:
    print(e)
断言:如果条件成立,继续执行,如果条件不成立,直接抛异常
用于强制用户服从,不服从就报错,可捕获,一般不捕获
print(123)
assert True
print(456)

五、反射
foor内容:
NAME = 'fanjinbao'
def func():
    return 'func'
def f1():
    return 'HOME'
def f2():
    return 'NEWS'
def f3():
    return 'CREAM'
根据输入内容打印请求内容:
import foor
imp = input('please ent you choice: ')
if hasattr(foor, imp):
    func = getattr(foor, imp)
    print(func())
else:
    print('404')
六、单例模式
class Fansik:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def show(self):
        print(self.name, self.age)
v = None
if v:
    v.show()
else:
    v = Fansik("fanjinbao", 19)
    v.show()
posted @ 2017-10-23 18:01  fansik  阅读(210)  评论(0编辑  收藏  举报