zoukankan      html  css  js  c++  java
  • python:类的特殊成员方法与反射

    #!usr/bin/env python
    # -*- coding:utf-8 -*-

    __author__ = "Samson"

    class Foo:
    '''描述类的信息'''
    country = "China"
    def __init__(self,name):
    self.name = name

    def func(self):
    pass

    def __call__(self, *args, **kwargs):
    print("running all",args,kwargs)

    def __str__(self):#当实例过多时,可以确定是哪个实例
    return "obj:%s" %self.name
    #__getitem__,__setitem__,__delitem__用于索引操作,如字典。分别表示获取、设置、删除数据
    def __getitem__(self, key):
    print("__getitem__",key)

    def __setitem__(self, key, value):
    print("__getitem__",key,value)

    def __delitem__(self, key):
    print("__delitem__",key)
    print(Foo.__doc__)#__doc__表示类的描述信息
    obj = Foo("samson")
    print(obj.__module__,obj.__class__)#__module__表示当前操作的对象在哪个模块,__class__表示当前操作对象的类是什么
    obj()#执行__call__
    print(obj.__dict__)#打印类里的所有属性,不包括实例属性
    print(Foo.__dict__)#打印所有实例属性,不包括类属性
    print(obj)
    result = obj["k1"]#自动触发执行__getitem__
    obj["k2"] = "samson"#自动触发执行__setitem__
    del obj["k1"]#自动触发执行__delitem__


    #另外一种类的高B格写法,一切皆对象
    def __init__(self,name,age):
    self.name = name
    self.age = age

    def func(self):
    print("B格够高吗")

    Zoo = type("Zoo",(object,),{"talk":func,"__init__":__init__})#第二个参数继承的父类,第三个为类的成员方法
    f = Zoo("samson",20)
    f.talk()

    #!usr/bin/env python
    # -*- coding:utf-8 -*-

    __author__ = "Samson"

    class MyType(type):
    def __init__(self, what, bases = None, dict = None):
    print("--MyType init--")
    super(MyType,self).__init__(what,bases,dict)

    def __call__(self, *args, **kwargs):
    print("--MyType call--")
    obj = self.__new__(self, *args, **kwargs)#调用Foo中__new__方法
    self.__init__(obj, *args,**kwargs)#调用Foo中__init__方法

    class Foo(object):
    __metaclass__ = MyType#python3没变化,python2中会优先执行MyType中的__init__,__call__,之后是本类中__new__,__init__

    def __init__(self, name):
    self.name = name
    print("Foo --init--")

    def __new__(cls, *args, **kwargs):#用来创建实例的,真正实例化时会先于__init__执行
    print("Foo --new--")
    return object.__new__(cls)#继承父类的__init__方法

    # 第一阶段:解释器从上到下执行代码创建Foo类
    #第二阶段:通过Foo类创建obj对象
    obj= Foo("Samson")


    #!usr/bin/env python
    # -*- coding:utf-8 -*-

    __author__ = "Samson"

    def bulk(self):
    print("%s is yelling..." %self.name)

    class Dog(object):
    def __init__(self, name):
    self.name = name

    def eat(self,food):
    print("%s is eating..." %self.name,food)

    d = Dog("wangcai")
    choice = input(">>:").strip()

    if hasattr(d,choice):
    func = getattr(d,choice)
    delattr(d,choice)#删除对象中的方法与属性
    func("binggan")

    else:
    setattr(d,choice,bulk)#可以装配方法、属性
    setattr(d,"age",22)#装配属性
    d.talk(d)
    print(getattr(d,"age"))

    #hasattr(obj,name_str)#判断一个对象obj里是否有对应的name_str字符串的方法
    #getattr(obj,name_str)#根据字符串去获取obj对象里的对应的方法的内存地址


  • 相关阅读:
    Extension Methods(扩展方法)
    linux面试题
    渗透测试 day4
    渗透测试 day3
    渗透测试 day2
    渗透测试 day1
    9.3 网络安全介绍
    9.2 Iptables
    8.30 进程管理
    8.29 linux的网络
  • 原文地址:https://www.cnblogs.com/cansun/p/8270837.html
Copyright © 2011-2022 走看看