• 4 Python类


    4.1 类的定义

    # 类的定义
        class 类名:
            pass	# pass是空语句,不具有任何意义,仅为了保持程序结构完整性
    
    # 创建对象
    	对象名 = 类名()
    

    4.2 成员变量

    # 成员变量用于描述对象的固有状态或属性。
    # 成员变量定义语法
    class 类名:
        def __init__(self):
            # 公有属性
            self.变量名1 = 值1		
            self.变量名2 = None
            
    对象名.变量名 = 值		# 独有属性
    
    class Person:
        def __init__(self):
            self.name = None
            self.age = 22
    
    p1 = Person()
    p1.name = "Tom"
    p1.ID = 123456
    print(p1.name)
    print(p1.age)
    print(p1.ID)
    
    """
    公有变量与独有变量的区别
        公有变量在__init__方法中声明,每个对象都具有该变量
        独有变量在创建对象后声明,只有当前对象具有此变量
        定义对象的独有变量时,如果独有变量名与公有变量名相同,视为修改公有变量的值;如果独有变量名与公有变量名不相同,视为定义新的独有属性
        None含义是为空,表示没有具体的数据
    """
    

    4.3 成员方法

    # 成员方法用于描述对象的固有行为
    # 定义成员方法
    格式一(无参方法):
    class 类名:		 
    	def 方法名(self):
    		方法体
            
    class Cat:        
        def eat(self):
            print("猫吃鱼")
            
    格式二(有参方法)
    class 类名:		 
    	def 方法名(self,形参1,形参2,…):
    		方法体
            
    class Cat:     
    	def climb(self,meter):
    		print("猫会爬树,爬了%d米" % meter)
    
    # 调用成员方法
    格式一(调用无参方法): 
    	对象名.方法名()
    
    格式二(调用有参方法): 
    	对象名.方法名(实参1,实参2,…)
        
    # 成员方法中调用成员变量语法:self.变量名
    # 成员方法中调用成员方法语法:self.方法名(实参1,实参2,…)
    # self仅出现在成员方法中,指代执行该方法的对象。
    

    4.4 类变量

    # 概念:类变量是定义在类中,不属于某个具体对象的特征,被所有对象共同使用的特征;类变量可以私有化
    # 定义类变量语法格式
        class 类名:
            变量名 = 值
            
    # 调用类变量语法格式
    # 赋值格式:
    	类名.类变量名 = 值
    # 取值格式:
    	类名.类变量名(推荐)
    	对象名.类变量名(不推荐)
        
    class Student:
        Class = 132251		# 类变量
        __num = None		# 类变量可以私有化
        def info(self):
            self.name = None
            self.__score = None
            self.__IDcard = None
    
        def set_info(self, s_score, s_IDcard):
            self.__score = s_score
            self.__IDcard = s_IDcard
    
        def get_info(self):
            return self.__score, self.__IDcard
    
        
    stu = Student()
    stu.Class = 132252	     # 可通过stu.__class__.Class = xxx 修改,可通过类方法修改
    stu.name = input("name = ")
    stu.set_info(99, 13225223)
    x, y = stu.get_info()
    print("Class = %d Name = %s IDcard = %d Score = %d" % (Student.Class, stu.name, y, x))  
    

    4.5 类方法

    # 概念:类方法是定义在类中,不属于某个具体对象的行为,被所有对象共同使用的行为
    # 定义类方法基本语法:
    class 类名:
    	@classmethod
    	def 方法名(cls, 形参1,形参2,…):
    		方法体
            
    # 调用类方法语法格式
    	类名.类方法名(实参1,实参2,…)	 (推荐)
    	对象名.类方法名(实参1,实参2,…) (不推荐)
        
        
        Class = 132252
        def __init__(self):
            self.name = None
            self.score = None
    
        @classmethod
        def m_Print(cls):
            Student.score = 95
            print(Student.score)
            print(Student.Class)
            print("aaa")
    
    
    stu = Student()
    stu.name = "Tom"
    Student.m_Print()
    print(stu.name)    
    

    4.6 静态方法

    # 定义静态方法语法格式
    class 类名:
    	@staticmethod
    		def 方法名(形参1,形参2,…):
    			方法体
    
    # 调用静态方法语法格式
    	类名.静态方法名(实参1,实参2,…)	 (推荐)
    	对象名.静态方法名(实参1,实参2,…) (不推荐)
    
    各种方法定义规则
    	只访问成员变量的方法,定义成实例方法
    	只访问类变量的方法,定义类方法
    	既访问成员变量,也访问类变量的方法,定义成实例方法
    	既不访问成员变量,也不访问类变量,定义成静态方法
    

    4.7 __init__方法

    # __init__方法,也称为构造方法,创建对象时为对象初始化成员变量
    定义语法
    格式一:
    def __init__(self):
    	self.变量名1 = 值1
    格式二:
    def __init__(self,形参1,形参2,…):
    	self.__属性名1 = 形参1
    	self.__属性名2 = 形参2
    

    4.8 __str__方法

    # __str__方法是在使用print函数打印输出对象到屏幕时被调用的方法,用于返回对象的规范化字符串表现形式
    def __str__(self):
    	return 打印对象是显示的信息
    
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def __str__(self):
            return "name = %s, age = %d" % (self.name, self.age)
    
    
    p1 = Person("Tom",22)
    print(p1)
    

    4.9 property

    • 一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法

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

      • 定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数

      • 调用时,无需括号

      方法:foo_obj.func()
      property属性:foo_obj.prop
      
      
      class Pager:
          def __init__(self, current_page):
              # 用户当前请求的页码(第一页、第二页...)
              self.current_page = current_page
              # 每页默认显示10条数据
              self.per_items = 10 
      
          @property
          def start(self):
              val = (self.current_page - 1) * self.per_items
              return val
      
          @property
          def end(self):
              val = self.current_page * self.per_items
              return val
      
      ################ 调用 ###############
      p = Pager(1)
      p.start  # 就是起始值,即:m
      p.end  # 就是结束值,即:n
      
      • Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回
    • property属性的有两种方式

      • 装饰器 即:在方法上应用装饰器
      # 经典类
      class Goods:
          @property
          def price(self):
              return "laowang"
      
      obj = Goods()
      result = obj.price  # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
      print(result)
      
      # 新式类
      class Goods:
          """python3中默认继承object类
              以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter  @xxx.deleter
          """
          @property
          def price(self):
              print('@property')
      
          @price.setter
          def price(self, value):
              print('@price.setter')
      
          @price.deleter
          def price(self):
              print('@price.deleter')
      
      
      obj = Goods()
      obj.price          # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
      obj.price = 123    # 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数
      del obj.price      # 自动执行 @price.deleter 修饰的 price 方法
      
      
      经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法
      新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法
      由于新式类中具有三种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除
      
      • 类属性 即:在类中定义值为property对象的类属性
      当使用类属性的方式创建property属性时,经典类和新式类无区别
      
      
      class Foo(object):
          def get_bar(self):
              print("getter...")
              return 'laowang'
      
          def set_bar(self, value): 
              """必须两个参数"""
              print("setter...")
              return 'set value' + value
      
          def del_bar(self):
              print("deleter...")
              return 'laowang'
      
          BAR = property(get_bar, set_bar, del_bar, "description...")
      
      obj = Foo()
      
      obj.BAR  # 自动调用第一个参数中定义的方法:get_bar
      obj.BAR = "alex"  # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入
      desc = Foo.BAR.__doc__  # 自动获取第四个参数中设置的值:description...
      print(desc)
      del obj.BAR  # 自动调用第三个参数中定义的方法:del_bar方法
      
      
      property方法中有个四个参数
      	第一个参数是方法名,调用 对象.属性 时自动触发执行方法
      	第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
      	第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
      	第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息
          
      由于类属性方式创建property属性具有3种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除
      

    4.10 魔法属性

    • __doc__ : 表示类的描述信息

      class Foo:
          """ 描述类信息,这是用于看片的神奇 """
          def func(self):
              pass
      
      print(Foo.__doc__)
      #输出:类的描述信息
      
    • __module__ : 表示当前操作的对象在哪个模块

      class Person(object):
          def __init__(self):
              self.name = 'laowang'
              
      obj = Person()
      print(obj.__module__)  # 输出 test 即:输出模块
      print(obj.__class__)
      
    • __class__ : 表示当前操作的对象的类是什么

    • __del__ : 当对象在内存中被释放时,自动触发执行,此方法一般无须定义

      class Foo:
          def __del__(self):
              pass
      
    • __call__ : 对象后面加括号,触发执行

      注:__init__方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
      
      class Foo:
          def __init__(self):
              pass
      
          def __call__(self, *args, **kwargs):
              print('__call__')
      
      
      obj = Foo()  # 执行 __init__
      obj()  # 执行 __call__
      
    • __dict__ : 类或对象中的所有属性

      类的实例属性属于对象;类中的类属性和方法等属于类
      class Province(object):
          country = 'China'
      
          def __init__(self, name, count):
              self.name = name
              self.count = count
      
          def func(self, *args, **kwargs):
              print('func')
      
      # 获取类的属性,即:类属性、方法、
      print(Province.__dict__)
      
      obj1 = Province('山东', 10000)
      print(obj1.__dict__)
      # 获取 对象obj1 的属性
      # 输出:{'count': 10000, 'name': '山东'}
      
      obj2 = Province('山西', 20000)
      print(obj2.__dict__)
      # 获取 对象obj1 的属性
      # 输出:{'count': 20000, 'name': '山西'}
      
    • __getitem__、__setitem__、__delitem__

      # 用于索引操作,如字典。以上分别表示获取、设置、删除数据
      class Foo(object):
      
          def __getitem__(self, key):
              print('__getitem__', key)
      
          def __setitem__(self, key, value):
              print('__setitem__', key, value)
      
          def __delitem__(self, key):
              print('__delitem__', key)
      
      
      obj = Foo()
      
      result = obj['k1']      # 自动触发执行 __getitem__
      obj['k2'] = 'laowang'   # 自动触发执行 __setitem__
      del obj['k1']           # 自动触发执行 __delitem__
      
    • __getslice__、__setslice__、__delslice__

      # 该三个方法用于分片操作,如:列表
      class Foo(object):
      
          def __getslice__(self, i, j):
              print('__getslice__', i, j)
      
          def __setslice__(self, i, j, sequence):
              print('__setslice__', i, j)
      
          def __delslice__(self, i, j):
              print('__delslice__', i, j)
      
      obj = Foo()
      
      obj[-1:1]                   # 自动触发执行 __getslice__
      obj[0:1] = [11,22,33,44]    # 自动触发执行 __setslice__
      del obj[0:2]                # 自动触发执行 __delslice__
      
      # 切片可对该类实例化出的对象的原数据进行设置、修改、删除
      
  • 相关阅读:
    WPF Timer替代者
    <转>Change the Background of a selected ListBox Item
    WPF Button样式模板
    WPF中自定义只能输入数字的TextBox
    ansible playbook模式及语法
    数据挖掘Kaggle
    电影网站
    数据挖掘面临的科学和工程的新问题
    KDD Cup 2012(今年数据挖掘在中国)
    能力是在执行中实现的,要高节奏不要详细的设计
  • 原文地址:https://www.cnblogs.com/chungeyuan/p/11410277.html
Copyright © 2020-2023  润新知