• python 面向对象(类的成员,属性,绑定和非绑定,)


    • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
    • 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中)
    • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
    • 面向对象三大特性:封装、继承和多态

    类的成员

    类的成员可以分为三大类:字段、方法和属性

    注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。

    一、字段

    字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,

    • 普通字段属于对象
    • 静态字段属于
     1 class Province:
     2 
     3     # 静态字段
     4     country = '中国'
     5 
     6     def __init__(self, name):
     7 
     8         # 普通字段
     9         self.name = name
    10 
    11 
    12 # 直接访问普通字段
    13 obj = Province('河北省')
    14 print (obj.name)
    15 
    16 # 直接访问静态字段
    17 print(Province.country)
    18 
    19 #字段的定义和使用
    View Code

    由上述代码可以看出【普通字段需要通过对象来访问】【静态字段通过类访问】,在使用上可以看出普通字段和静态字段的归属是不同的。其在内容的存储方式类似如下图:

    由上图可是:

    • 静态字段在内存中只保存一份
    • 普通字段在每个对象中都要保存一份

    应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段

    属性:

    如果你已经了解Python类中的方法,那么属性就非常简单了,因为Python中的属性其实是普通方法的变种。

    对于属性,有以下三个知识点:

    • 属性的基本使用
    • 属性的两种定义方式

    1、属性的基本使用

     1 # ############### 定义 ###############
     2 class Foo:
     3 
     4     def func(self):
     5         pass
     6 
     7     # 定义属性
     8     @property
     9     def prop(self):
    10         pass
    11 # ############### 调用 ###############
    12 foo_obj = Foo()
    13 
    14 foo_obj.func()
    15 foo_obj.prop   #调用属性
    属性的调用

    由属性的定义和调用要注意一下几点:

    • 定义时,在普通方法的基础上添加 @property 装饰器;
    • 定义时,属性仅有一个self参数
    • 调用时,无需括号
                 方法:foo_obj.func()
                 属性:foo_obj.prop

    注意:属性存在意义是:访问属性时可以制造出和访问字段完全相同的假象

    绑定方法与非绑定方法

    类中定义的函数分成两大类:

      一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):

        1. 绑定到类的方法:用classmethod装饰器装饰的方法。

                    为类量身定制

                    类.boud_method(),自动将类当作第一个参数传入

                  (其实对象也可调用,但仍将类当作第一个参数传入)

        2. 绑定到对象的方法:没有被任何装饰器装饰的方法。

                   为对象量身定制

                   对象.boud_method(),自动将对象当作第一个参数传入

                 (属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)

      二:非绑定方法:用staticmethod装饰器装饰的方法

         1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。就是一个普通工具而已

        注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说

    class Foo:
        def test1(self):
            print('test1',self)
    
        def test2(self):
            print('test2',self)
    
        def test3(self):
             print('test3',self)
    f=Foo()
    f.test1()
    f.test2()
    f.test3()
    
    #输出
    #test1 <__main__.Foo object at 0x002059F0>
    # test2 <__main__.Foo object at 0x002059F0>
    # test3 <__main__.Foo object at 0x002059F0>
    View Code

    1 staticmethod

    statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果,python为我们内置了函数staticmethod来把类中的函数定义成静态方法

    import hashlib
    import time
    class MySQL:
        def __init__(self,host,port):
            self.id=self.create_id()
            self.host=host
            self.port=port
        @staticmethod
        def create_id(): #就是一个普通工具
            m=hashlib.md5(str(time.clock()).encode('utf-8'))
            return m.hexdigest()
    
    
    print(MySQL.create_id) #<function MySQL.create_id at 0x0000000001E6B9D8> #查看结果为普通函数
    conn=MySQL('127.0.0.1',3306)
    print(conn.create_id) #<function MySQL.create_id at 0x00000000026FB9D8> #查看结果为普通函数
    View Code

    2 classmethod

      classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入),python为我们内置了函数classmethod来把类中的函数定义成类方法

    #setting
    ““”
    HOST='127.0.0.1'
    PORT=3306
    “””
    import settings
    import hashlib
    import time
    class MySQL:
        def __init__(self,host,port):
            self.host=host
            self.port=port
    
        @classmethod
        def from_conf(cls):
            print(cls)
            return cls(settings.HOST,settings.PORT)
    
    print(MySQL.from_conf) #<bound method MySQL.from_conf of <class '__main__.MySQL'>>
    conn=MySQL.from_conf()
    
    print(conn.host,conn.port)
    conn.from_conf() #对象也可以调用,但是默认传的第一个参数仍然是类
    View Code
  • 相关阅读:
    C# FileStream 文件复制
    DataSnap Server 客户端调用 异常
    抛出异常 exception
    RAD Tokyo 10.2.2
    delphi ios info.plist
    sql 日期格式
    sql server 2014登录账号
    sql server导入excel数据
    dev16 cxgrid 在DLL里报0地址错
    sql server 查看所有表记录数
  • 原文地址:https://www.cnblogs.com/zjltt/p/7001982.html
Copyright © 2020-2023  润新知