面向对象之补充

1 组合补充

<1>类或对象可以做字典的key

<2>对象中到底有什么

class Foo(object):
#
#     def __init__(self,age):
#         self.age = age
#
#     def display(self):
#         print(self.age)
#
# data_list = [Foo(8),Foo(9)]
# for item in data_list:
#     print(item.age,item.display())   #8  8 None     9  9 None 

#class StarkConfig(object):
#
#     def __init__(self,num):
#         self.num = num
#
#     def changelist(self,request):
#         print(self.num,request)
#
# class RoleConfig(StarkConfig):
#
#     def changelist(self,request):
#         print(‘666‘)
#
# # 创建了一个列表,列表中有三个对象(实例)
# # [ StarkConfig对象(num=1), StarkConfig对象(num=2), RoleConfig对象(num=3) ]
# config_obj_list = [StarkConfig(1),StarkConfig(2),RoleConfig(3)]
# for item in config_obj_list:
#     print(item.num)

#结果为 1 2 3

2主动调用其它类成员(2种方式):

方式一:类.实例方法(自己传self)    与继承无关

class Base:
    def f1(self):
        print(‘五个功能‘)
class Foo:
    def f1(self):
        print(‘三个功能‘)
        Base.f1(self)   #主动调用Base里面的f1,传了self
obj =Foo()
obj.f1()

主动调用方式一

方式二:按照类的继承顺序,找下一个

class Base(object):
    def f1(self):
        print(‘五个功能‘)
class Foo(Base):
    def f1(self):
        super().f1()    #调用继承顺序中的下一个
        print(‘三个功能‘)
obj = Foo()
obj.f1()

主动调用方式二

class Foo(object):
    def f1(self):
        super().f1()
        print(‘三个功能‘)
class Bar(object):
    def f1(self):
        print(‘6各功能‘)
class Info(Foo,Bar):
    pass
# obj =Foo()
# obj.f1()# error‘super‘ object has no attribute ‘f1‘ 创建对象是Foo
obj = Info()
obj.f1()  #结果为 6各功能 三个功能

再来一次

3特殊成员:

A 类名()    自动执行__init__

# obj = Foo(1,2)

class Foo:
    def __init__(self,name,age):
        self.name=name
        self.age=age
obj=Foo(1,2) #创建对象时就执行init初始化 1,2的传到self.name self.age中

特殊方法-初始化

B 对象()     自动执行__call__

# ret = obj(1,2,3,k=456)

class Foo:
    def __call__(self, *args, **kwargs):
        print(‘hahah‘,123,args,kwargs)#打印 hahah 123 (1, 2, 3)
        return 666  #可返回值
obj=Foo()
ret=obj(1,2,3,k=456)# 传参,传到位置参数*args中,关键字参数到**kwargs中
print(ret)  #返回值666

C对象[ ]     自动执行__getitem__

# ret=obj[‘鱼香肉丝‘]

#print(ret)

class Foo:
    def __getitem__(self, item):
        print(item)  #打印 鱼香肉丝
        return 888
obj = Foo()
ret=obj[‘鱼香肉丝‘] #自动运行__getitem__方法
print(ret)  #返回值888

D 对象[‘xx‘]=11  自动执行__setitem__

# obj[‘k1‘]=123

class Foo:
    def __setitem__(self, key, value):
        print(key,value)  #打印 k1  123
obj = Foo()
obj[‘k1‘]=123 #自动运行__setitem__方法

E del 对象[xx] 自动执行__delitem__

# del obj [‘uuu‘]

class Foo:
    def __delitem__(self, key):
        print(key)  #打印 k1
obj = Foo()
del obj[‘k1‘] #自动运行__delitem__方法

F 对象+对象  自动执行__add__

# obj1=Foo(1,2)

#obj2=Foo(88,99)

# ret =obj2+obj1

#print(ret)

class Foo(object):
    def __init__(self,a1,a2):  #必须有
        self.a1=a1
        self.a2=a2
    def __add__(self, other):
       return self.a1+other.a2
obj= Foo(1,2)
obj1 = Foo(88,99)
ret = obj+obj1 #自动运行__add__方法
print(ret)

G with 对象   自动执行__enter__/__exit__

#obj=Foo(1,2)

#with obj as f:

#  print(f)

class Foo(object):
    def __init__(self, a1, a2):
        self.a1=a1
        self.a2=a2
    def __enter__(self):
        print(888)
        return 999
    def __exit__(self, exc_type, exc_val, exc_tb):
        print(666)
obj= Foo(1,2)
with obj as f:
    print(f)

H真正的构造方法:

# class Foo(object):#     def __init__(self, a1, a2):     # 初始化方法#         """#         为空对象进行数据初始化#         :param a1:#         :param a2:#         """#         self.a1 = a1#         self.a2 = a2##     def __new__(cls, *args, **kwargs): # 构造方法#         """#         创建一个空对象#         :param args:#         :param kwargs:#         :return:#         """#         return object.__new__(cls) # Python内部创建一个当前类的对象(初创时内部是空的.).## obj1 = Foo(1,2)# print(obj1)## obj2 = Foo(11,12)# print(obj2)

原文地址:https://www.cnblogs.com/lingcai/p/9557325.html

时间: 2024-08-03 01:18:49

面向对象之补充的相关文章

第八章 面向对象实例补充

面向对象的特征: 封装:就算对象内部的数据结构改变了,只要公开给外部的方法名.功能没有改变,使用者就照常使用即可,比如我们去调用Time类的方法. 多态:Object类.String类和Float类的各个对象调用to_s的方法,得到的结果是不一样的. 多态的思考方法----鸭子模型 "能像鸭子那样走路,能像鸭子一样啼叫的,那一定是鸭子",注重对象的行为(走路.啼叫都像鸭子),那么不管是不是真的鸭子都把它当作鸭子.举例如下: fetch_and_downcase只要求(能以ary[ind

Python 面向对象的补充

isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 1 class Foo(object): 2 pass 3 4 class Bar(Foo): 5 pass 6

python学习笔记-Day08--(面向对象)--补充

类还有两个方法,一个是判断一个对象是否是某个类的实例,另外一个方法是判断一个类是否是另外一个类的子类. isinstance(obj,cls)检查obj是否是类cls的对象返回结果为布尔值 issubclass(sub,supper)检查sub是否是supper的派生类返回结果为布尔值 注意:如果一个类C的基类B继承自某个类A,那么类C也是类A的的派生类 class A:            pass class B(A):            pass class C(B):       

python_day8 面向对象常用 补充

__str__ 作用本来 打印 类对象是 打印的内存地址 但是在类中 增加 __str__ 参数 以后 再打印这个 类对象 就是显示 __str__中的 return __del__作用 当 实例化的对象 在内存中 被释放的时候执行 item操作通过 set get del 操作 item最终目的是将 类里面的 变量 像 字典一样操作当这样执行时,会触发不同的item class A: def __init__(self,name): self.name=name def __getitem__

面向对象知识点补充

1.object object是所有数据类型的祖先.   (集合里边可以放object类型即集合里边可以放任意类型) 2.is   as 即类型转换运算符(类型)对象这种方法不推荐 is   判断某个对象或者变量是否为什么类型(比如o  is random,这就是判断o是否为随机数类型,返回值是bool型) as 类型转换,如果某个对象能转换成某个类型,那么它会进行转换如果无法转换成目标类型,那么它会返回一个null,不会抛出异常(random  r=o as random:if(r !=nul

面向对象遗忘补充

只要存在继承关系,从子类进入到父类中,父类内部方法执行过程中的self就都是子类的实例对象. 如果没有继承关系存在,那其内部方法的self就是该类本身的实例对象. 类/对象的绑定方法,在执行时都会自默认将这个对象或者类以隐藏self的形式传入. 原文地址:https://www.cnblogs.com/xuechengeng/p/10424847.html

Java学习笔记16(面向对象九:补充内容)

总是看到四种权限,这里做一个介绍: 最大权限是public,后面依次是protected,default,private private修饰的只在本类可以使用 public是最大权限,可以跨包使用,不同包的子类和无关类都可以使用,可以修饰类,方法,成员变量 不写权限就是default默认权限:限于本包内使用 protected权限:跨包后的类如果有继承关系(子类),不能使用default修饰的,而可以使用protected修饰的,调用时候必须在子类的里面才可以调用父类的受保护权限,注意prote

Python自动化运维之5、内置函数

python3.x内置函数 一些例子:后期慢慢接触到再补充 # help() 详细查看某个类有那些方法或者方法的具体使用 >>> help(str) >>> help(str.strip) # dir() 快速查看某个类有那些方法或者方法的具体使用 >>> dir(str) >>> dir(str.strip) # int() 实例化数字类型,或将其他类型转换为数字类型,或各种进制转换为十进制 (1)实例化数字类型 >>&

JSP常见知识点

false 7.8 磅 0 2 false false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5