10、python全栈之路-面向对象进阶

十、面向对象进阶

http://www.cnblogs.com/Eva-J/articles/7351812.html

1、isinstance和issubclass

1.1 isinstance(obj,cls)

isinstance(obj,cls)检查是否obj是否是类 cls 的对象

1.2 issubclass(sub, super)

issubclass(sub, super)检查sub类是否是 super 类的派生类

2、反射

#把一个字符串数据类型的变量变成一个真实存在在这个程序中的变量名,并且能够使用它

#getattr是反射的灵魂

#hasatte和getattr是最佳cp

#类名调属性或方法(静态(类)属性,静态方法和类方法)

#对象名调属性或方法(对象属性,普通方法(self))

#模块名调用属性或方法(变量,函数)

#在自己模块中调用属性或方法(变量,函数)

#自己的模块表示:sys.modules[__name__]

###setattr

####delattr

2.1 getter()

getattr(对象,‘方法名或者属性名‘),不通过调用类的方法,直接用这个函数来调用方法

2.2 hasattr()

hasattr(对象,‘方法名或者属性名‘) 判断对象中是否存在这个方法或属性 返回布尔值

如果方法不存在会报错,这时候就需要用到hasattr来做判断

if hasattr(jinghong,‘sleep‘):
    func = getattr(jinghong,‘sleep‘)
    func()

2.3 setattr()

设置属性

2.4 delattr()

2.5 类名调属性或方法

静态(类)属性,静态方法和类方法

2.6 对象名调属性或方法

对象属性,普通方法(self)

2.7 模块名调用属性或方法

变量,函数

2.8 在自己模块中调用属性或方法

变量,函数

#自己的模块表示:sys.modules[__name__]

3、类的内置方法

#python的类的内置方法和内置函数还有其他函数都有千丝万缕的联系

3.1 __str__和__repr__

format_dict = {
    ‘nat‘: ‘{obj.name}-{obj.addr}-{obj.type}‘,  # 学校名-学校地址-学校类型
    ‘tna‘: ‘{obj.type}:{obj.name}:{obj.addr}‘,  # 学校类型:学校名:学校地址
    ‘tan‘: ‘{obj.type}/{obj.addr}/{obj.name}‘,  # 学校类型/学校地址/学校名
}

class School:
    def __init__(self, name, addr, type):
        self.name = name
        self.addr = addr
        self.type = type

def __repr__(self):
        return ‘School(%s,%s)‘ % (self.name, self.addr)

def __str__(self):
        return ‘(%s,%s)‘ % (self.name, self.addr)

def __format__(self, format_spec):
        # if format_spec
        if not format_spec or format_spec not in format_dict:
            format_spec = ‘nat‘
        fmt = format_dict[format_spec]
        return fmt.format(obj=self)

s1 = School(‘oldboy1‘, ‘北京‘, ‘私立‘)
print(‘from repr: ‘, repr(s1))
print(‘from str: ‘, str(s1))
print(s1)

‘‘‘
str函数或者print函数--->obj.__str__()
repr或者交互式解释器--->obj.__repr__()
如果__str__没有被定义,那么就会使用__repr__来代替输出
注意:这俩方法的返回值必须是字符串,否则抛出异常
‘‘‘
print(format(s1, ‘nat‘))
print(format(s1, ‘tna‘))
print(format(s1, ‘tan‘))
print(format(s1, ‘asfdasdffd‘))

class B:
    def __str__(self):
        return ‘str : class B‘

    def __repr__(self):
        return ‘repr : class B‘

b = B()
print(‘%s‘ % b)
print(‘%r‘ % b)

3.2 __del__

析构方法,当对象在内存中被释放时,自动触发执行。

3.3 __getitem__\__setitem__\__delitem__

class Foo:
    def __init__(self,name):
        self.name=name

def __getitem__(self, item):
        print(self.__dict__[item])

def __setitem__(self, key, value):
        self.__dict__[key]=value
    def __delitem__(self, key):
        print(‘del obj[key]时,我执行‘)
        self.__dict__.pop(key)
    def __delattr__(self, item):
        print(‘del obj.key时,我执行‘)
        self.__dict__.pop(item)

f1=Foo(‘sb‘)
f1[‘age‘]=18
f1[‘age1‘]=19
del f1.age1
del f1[‘age‘]
f1[‘name‘]=‘alex‘
print(f1.__dict__)

3.4 __new__

3.4.1 __new__

class A:
    def __init__(self):
        self.x = 1
        print(‘in init function‘)
    def __new__(cls, *args, **kwargs):
        print(‘in new function‘)
        return object.__new__(A, *args, **kwargs)

a = A()
print(a.x)

class Singleton:
    def __new__(cls, *args, **kw):
        if not hasattr(cls, ‘_instance‘):
            orig = super(Singleton, cls)
            cls._instance = orig.__new__(cls, *args, **kw)
        return cls._instance

one = Singleton()
two = Singleton()

two.a = 3
print(one.a)
# 3
# one和two完全相同,可以用id(), ==, is检测
print(id(one))
# 29097904
print(id(two))
# 29097904
print(one == two)
# True
print(one is two)

3.4.2 单例模式

#单例模式  实例始终只有一个 他的属性可以随着你的改变而改变

class Teacher:               #创建一个老师类
    __isinstance = None      #创建一个私有静态变量来装裸着的对象
    def __new__(cls, *args, **kwargs):   #创建一个裸着的对象
        if not cls.__isinstance:         #如果__isinstance属性为None
            cls.__isinstance = object.__new__(cls)   #用object.__new__创建一个裸着的对象
        return cls.__isinstance          #返回一个对象

    def __init__(self,name,cloth):       #self就是cls.__isinstance返回的对象
        self.name = name                 #给self的name属性赋值
        self.cloth = cloth               #给self的cloth属性赋值

刘老师 = Teacher(‘刘永熹‘,‘白色‘)
print(刘老师.name)
王老师 = Teacher(‘王庆帅‘,‘黑色‘)
王老师2 = Teacher(‘王庆帅‘,‘黑色‘)
王老师3 = Teacher(‘王庆帅‘,‘黑色‘)
王老师4 = Teacher(‘王庆帅‘,‘黑色‘)
print(刘老师.name)
print(王老师)
print(王老师2)
print(王老师3)
print(王老师4)

3.5 __call__

对象后面加括号,触发执行。

class Foo:
    def __init__(self):
        pass

    def __call__(self, *args, **kwargs):
        print(‘__call__‘)

obj = Foo()  # 执行 __init__
obj()  # 执行 __call__

3.6 __len__

class A:
    def __init__(self):
        self.a = 1
        self.b = 2

def __len__(self):
        return len(self.__dict__)
a = A()
print(len(a))

3.7 __hash__

class A:
    def __init__(self):
        self.a = 1
        self.b = 2

def __hash__(self):
        return hash(str(self.a)+str(self.b))
a = A()
print(hash(a))

3.8 __eq__

class A:
    def __init__(self):
        self.a = 1
        self.b = 2

def __eq__(self,obj):
        if  self.a == obj.a and self.b == obj.b:
            return True
a = A()
b = A()
print(a == b)

3.9 面试题

#     有一个类的init方法如下:

#     class Person:

#         def __init__(self,name,age,sex,weight):

#             self.name = name

#             self.sex = sex

#             self.age = age

#             self.weight = weight

#     假设有100个person的对象,

#     若两个对象的obj1,obj2的name和sex属性相同

#     即obj1.name==obj2.name and obj1.sex==obj2.sex

#     我们认为两个对象为同一个对象,已知一个列表中的100个对象,对这100个对象进行去重。

#     提示:

#         重写Person类重的两个内置方法

class Person:
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age

def __hash__(self):
        return hash(self.name+self.sex)

def __eq__(self, other):
        if self.name == other.name and self.sex == other.sex:
            return True
obj_lst = []
for i in range(100):
    obj_lst.append(Person(‘liquan‘,‘male‘,i))
print(obj_lst)
print(set(obj_lst))   #unhashable

时间: 2024-10-09 13:35:10

10、python全栈之路-面向对象进阶的相关文章

Python全栈之路----面向对象开发----封装

封装之如何隐藏属性 在python中用双下划线开头的方式设置属性将属性隐藏起来(设置成私有的),以双下划线开头且双下划线结尾的是python的内置方法. # 其实这仅仅这是一种变形操作 # 类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class A: __N=0 # 类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的,如__N,会变形为_A__N def __init__(self): self.__X=10 # 变形为self._A__X def

Python全栈之路----面向对象开发----元类介绍

储备知识exec,可以被当作函数来看待. 参数1:字符串形式的命令 参数2:全局作用域(字典形式),如果不指定默认就使用globals() 参数3:局部作用域(字典形式),如果不指定默认就使用locals() g = {'x':1, 'y':2} l = {} exec(''' global x,m x = 10 m = 100 z = 3 ''', g, l) python中一切皆对象,对象可以怎么用? 1.都可以被引用,x = obj 2.都可以当作函数的参数传入 3.都可以当作函数的返回值

Python全栈之路----函数进阶----名称空间

又名name space,顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的=地方 名称空间共3种,分别如下 locals:是函数内的名称空间,包括局部变量和形参 globals:全局变量,函数定义所在模块的名称空间 builtins:内置模块的名称空间(Python解释器自带的内置模块) >>> x = 1 >>> locals() #处在该区域,打印该区域所有变量 {'__na

Python全栈之路----函数进阶----闭包

关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个这样的内部函数在包含它们之外被调用时,就会形成闭包.也就是说,内部函数会在外部函数返回后被执行.而当这个内部函数执行时,它仍然必须访问其外部函数的局部变量.参数以及其他内部函数.这些局部变量.参数和函数声明(最初时)的值是外部函数的返回时的值,但也会受到内部函数的影响. def func(): n = 10 def func2(): print(

Python全栈之路----函数进阶----作用域的查找空间

n = 10 def func(): n = 20 print('func:',n) def func2(): n = 30 print('func2:',n) def func3(): print('func3:',n) func3() func2() func() 问题:在func3()里打印的n的值是多少?   30 LEGB代表名字查找顺序:locals -> enclosing function -> globals -> _builtins_ locals 是函数内的名字空间

Python全栈之路----面向对象开发----反射

反射:通过字符串映射到对象的属性 class People: country = 'China' def __init__(self, name, age): self.name = name self.age = age def talk(self): print('%s is talking' %self.name) obj = People('egon', 18) print(obj.name) # obj.__dict__['name'] print(obj.talk) choice =

Python全栈之路系列之赋值与运算符

Python全栈之路系列之赋值与运算符 在继续下面的文章之前我们先来浏览一下Python为我们提供的几种运算符,定义两个变量,分别是a和b,a的值是10,b的值是20. 算术运算符 运算符 描述 实例 + 加,两个对象相加 a+b=30 - 减,两个对象相减,可能会得到负数 a-b=-10 * 乘,两数相称或是返回一个被重复若干次的字符串 a*b=200 / 除,两个对象相除 b/a=2 % 取膜,返回除法的余数 b%a=0 ** 幂,返回x的y次幂 a**b=10000000000000000

Python全栈之路_01

Python全栈之路 前言:因为Python主要是在Linux和widows操作系统上使用所以,首先就介绍Pyhton在这两个平台上的安装和一些基础知识 Linux系统下安装Pyhton 1.工具 虚拟机:VMware workstation 12 Pro Linux系统:CentOS 64 位 VMware虚拟机安装很简单就不说明了. 在虚拟机安装CentOS 需要注意的是: 运行内存分配1G左右即可 可以开机按F2进入bios界面boot目录下选择启动设备选择Hard Drive为优先启动位

python 全栈之路

python 全栈之路 一. python 1. Python基础知识部分 Python Python那点事 Python windows和linux下 安装 Python2,Python3 Python 开启入坑之路 Python 基本数据类型 Python 那些零碎的知识点 Python -函数 Python - 面对对象 Python - 模块 Python - 文件操作 Python - python中经常踩得的坑 2. Python - 网络编程 3. Python - 并发编程 二.