• 面向对象编程——类(class)2


    一、类成员修饰符

    公共成员:可以在类的外部访问到。我们之前接触到的都是公共成员

    私有成员:只能在该类的内部才能直接访问到的(子类也不能直接访问);在外部,可以通过间接方法才能取得。 以字段(普通字段和静态字段相同)为例,开头加__(双下划线)使字段变为私有字段;方法也一样,方法名前面加__(双下划线)即可。

    class db:
        def __init__(self,ip,username,passwd):
            self.__ip = ip
            self.__username = username
            self.__passwd = passwd
    
        def show(self):
            return self.__ip
    
    obj = db('1.1.1.1','root','123456')
    print(obj.__ip)         # 会报异常
    
    ip = obj.show()
    print(ip)               # 通过show方法才能拿到
    

    二、类中的特殊成员

    1、 构造方法 __init__方法

    类() 自动执行
    

    2、 类似构造方法,这里是一个特殊的调用方法 __call__方法

    对象() 或者 类()() 自动执行
    class foo:
        def __init__(self):
            print("in init")
    
        def __call__(self,*args,**kwargs):
            print("in call")
    
    obj = foo()         # 创建对象 obj
    obj()               # 对象后面加括号,调用,则执行类中的__call__方法
    

    3、 特殊方法 __int__方法

    class foo:
        def __init__(self):
            pass
    
        def __int__(self):
            return 123
    
    obj = foo()
    print(obj,type(obj))
    
    print(int(obj))         # 将obj对象强制转换为int类型。返回123
    
     
    在上面例子中,我们执行 int(对象),则自动执行 对象的\_\_int__方法,并将返回值赋值给 int(对象); 实际字符串强转整型时,就是这样。我们定义字符串时,其实是调用的str类,将我们定义的字符串的值传给了该类中。s = 'bashrunning' 就是 s = str('bashrunning'),可以看出,s就是一个对象。 

    同理,还有 __str__方法、列表的(__getitem__、__setitem__、__delitem__)方法。

    我们用的比较多的是__str__方法。 使用案例:

    class ourssh:
        def __init__(self,ip,username,passwd):
            self.ip = ip
            self.username = username
            self.passwd = passwd
    
        def __str__(self):
            return 'ip=%s
    username=%s
    passwd=%s' %(self.ip,self.username,self.passwd)
    
    obj = ourssh('1.1.1.1','root','123456')
    
    print(obj)          # 执行print时,实际上是执行的 str(obj)。如果ourssh类 中没有定义 __str__方法,则打印 <__main__.ourssh object at 0x0000018941FEB3C8>。定义了 __str__方法后,则打印 __str__方法返回的值
    

    print操作,其实是两个步骤:print(abc) == print(str(abc))

    步骤一: str(abc) ,调用 abc的__str__方法,得到返回值。 步骤二: print打印这个返回值。

    4、 __dict__方法 ,对象里自带的         重要

    class foo:
        def __init__(self,name,age):
            self.name = name
            self.age = age
            self.id = None
    
    obj = foo("bash",22)
    
    print(obj.__dict__)     # 返回一个字典 {'name': 'bash', 'age': 22, 'id': None} 这是这个对象的所有成员。如果成员是私有成员,则该成员的key为  _类名+该私有成员名
    
    print(foo.__dict__)     # 返回一个字典,这个类的所有成员。 如果成员是私有成员,则该成员的key为  _类名+该私有成员名
    

    5、 for循环拆解

    for循环遇到的对象是一个迭代器,则直接执行该对象的__next__方法。

    for循环遇到的对象是一个可迭代对象,则先执行__iter__方法来获取迭代器,然后再执行__next__方法。

    metaclass,元类,原始类,类的祖先

    在python中,一切事物皆是对象。

    __new__ 和 __metaclass__ 方法

    创建类就可以有两种方式:

    • a). 普通方式

      class Foo(object):
      
          def func(self):
              print 'hello wupeiqi'
      
    • b).特殊方式(type类的构造函数)

      def func(self):
          print 'hello wupeiqi'
      
      Foo = type('Foo',(object,), {'func': func})
      
      #type第一个参数:类名
      #type第二个参数:当前类的基类
      #type第三个参数:类的成员
      

    类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象?

    答:类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

    class MyType(type):
    
        def __init__(self, what, bases=None, dict=None):
            super(MyType, self).__init__(what, bases, dict)
    
        def __call__(self, *args, **kwargs):
            obj = self.__new__(self, *args, **kwargs)
    
            self.__init__(obj)
    
    class Foo(object):
    
        __metaclass__ = MyType
    
        def __init__(self, name):
            self.name = name
    
        def __new__(cls, *args, **kwargs):
            return object.__new__(cls, *args, **kwargs)
    
    # 第一阶段:解释器从上到下执行代码创建Foo类
    # 第二阶段:通过Foo类创建obj对象
    obj = Foo()
    

    以上感谢武老师的博客。

    反射

    单例模式

    如需转载,请注明出处,否则本人会追究法律责任!
  • 相关阅读:
    Windows 程序员必备的知识和工具
    由级别和性格特征将程序员分类 看看你属于哪一种
    调试九法:软硬件错误的排查之道<书评>
    逆向反汇编代码推算C++的局部变量
    逆向分析一个完整的C++程序包含寄存器与参数传递详解
    1607:Unable to install InstallShield Scripting runtime
    Form的构造函数和Load事件的区别?
    "春运男子持刀强行劫走17张卧铺票" ....
    SQL SERVER 2005中的Case When用法
    SBO中各个版本的密码
  • 原文地址:https://www.cnblogs.com/hacker001/p/10094786.html
Copyright © 2020-2023  润新知