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__ # 切片可对该类实例化出的对象的原数据进行设置、修改、删除

Python笔记_类的更多相关文章

  1. Python进阶_类与实例

    上一节将到面对对象必须先抽象模型,之后直接利用模型.这一节我们来具体理解一下这句话的意思. 面对对象最重要的概念就是类(class)和实例(instance),必须牢记类是抽象的模板,比如studen ...

  2. Python笔记_第三篇_面向对象_1.面向对象的基本概念和作用域

    1. 软件编程的实质: 软件编程就是将我们的思维转变成计算机能够识别语言的一个过程.重要的是思想,代码技术反而次要.因此思想也是最难的,突破固定的思想是关键 2. 什么是面向过程: * 自上而下顺序执 ...

  3. Python笔记_第三篇_面向对象_2.第一个Python类

    1. 设计一个类: 设计一个类主要从三个方面进行考虑: 第一:类名:类名要见名知意.首字母大写. 第二:属性. 第三:方法. 备注:在Python中有些东西并不是绝对化的事情,有些根据Python社区 ...

  4. Python笔记_第四篇_高阶编程_检测_2.对类进行单元检测

    1. 对类进行单元检测: 第一步:首先编写一个类: # 类名Person,person.py class Person(object): def __init__(self,name,age): se ...

  5. Python笔记_第四篇_高阶编程_GUI编程之Tkinter_2.控件类

    1. Label控件: 说明:标签控件,可显示文本 图示1: 实例1: import tkinter # 创建主窗口__编程头部 win = tkinter.Tk() # 设置标题 win.title ...

  6. Python笔记_第三篇_面向对象_8.对象属性和类属性及其动态添加属性和方法

    1. 对象属性和类属性. 我们之前接触到,在类中,我们一般都是通过构造函数的方式去写一些类的相关属性.在第一次介绍类的时候我们把一些属性写到构造函数外面并没有用到构造函数,其实当时在写的时候,就是在给 ...

  7. Python笔记_第三篇_面向对象_5.一个关于类的实例(人开枪射击子弹)

    1. 我们学了类的这些东西,用这些类我们来操作一个关于类的实例. 2. 题目:人开枪射击子弹,然后具有装弹动作,然后再开枪. 第一步:设计类: 人类名:Person属性:gun行为:fire,fill ...

  8. Python学习笔记_类

    class Animal(object): # 定义父类animal def __init__(self,name,sound): # 初始化属性 name sound self.name = nam ...

  9. 小甲鱼Python笔记(类)

    类和对象 类的构造方法 def __init__(): 1 class People: 2 def __init__(self,name): 3 self.name = name 注意:在构造方法中的 ...

随机推荐

  1. css inline-block 水平居中

    给父元素添加text-align: center即可. body { text-align: center; background-color: black; } #outer { margin: 1 ...

  2. [leetcode]95 Unique Binary Search Trees II (Medium)

    原题 字母题添加链接描述 一开始完全没有思路.. 百度看了别人的思路,对于这种递归构造的题目还是不熟,得多做做了. 这个题目难在构造出来.一般构造树都需要递归. 从1–n中任意选择一个数当做根节点,所 ...

  3. 【MySQL】(七)事务

    我的个人博客 http://www.haxianhe.com/ 数据库系统引入事务的主要目的:事务会把数据库从一种状态转换为另一种一致状态.在数据库提交工作时,可以确保要么所有修改都已经保存了,要么所 ...

  4. spring aop(四)

    直接找到解析aop标签的方法: protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate deleg ...

  5. Prometheus 整合 AlertManager

    简介 Alertmanager 主要用于接收 Prometheus 发送的告警信息,它很容易做到告警信息的去重,降噪,分组,策略路由,是一款前卫的告警通知系统.它支持丰富的告警通知渠道,可以将告警信息 ...

  6. textarea的拖拽怎么解决

    textarea文本域在页面中是可以拖动的,即时你给了固定的宽度和高度,但这在我们页面布局中,使我们不需要的,因为可拖拽很多时候会影响我们页面的布局和整体的美观度. css3提供了一个resize属性 ...

  7. Django使用本机IP无法访问,使用127.0.0.1能正常访问

    使用Django搭建web站点后,使用127.0.0.1能访问,但是用自己本机IP却无法访问. 我们先到Django项目中找到setting文件 找到——> ALLOWED_HOSTS = [] ...

  8. 数字麦克风PDM信号采集与STM32 I2S接口应用

    数字麦克风采用MEMS技术,将声波信号转换为数字采样信号,由单芯片实现采样量化编码,一般而言数字麦克风的输出有PDM麦克风和PCM麦克风,由于PDM麦克风结构.工艺简单而大量应用,在使用中要注意这二者 ...

  9. CentOS系统故障 | 一桩"血案"引发的容器存储驱动比较

    写在前面: 由于红帽在Linux界的影响力,相信很多朋友在测试和生产系统用的是RedHat或者CentOS系统,这次我在CentOS系统上遇到了一个很有意思的故障,通过这次故障的原因分析及解决,特意写 ...

  10. Netty源码解析—客户端启动

    Netty源码解析-客户端启动 Bootstrap示例 public final class EchoClient { static final boolean SSL = System.getPro ...