Jocx's blog

来了就先看看吧,没准有用呢?

0%

【语法】Python面向对象和进阶操作

Python面对对象和进阶操作

术语说明

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类变量/静态变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
  • 实例化:创建一个类的实例,类的具体对象。
  • 方法:类中定义的函数。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

静态变量

为全类共有的方法,实例对象不可调用,只能通过类名调用

公有、保护、私有和特殊方法

  • 公有方法的写法:

    1
    2
    3
    class Test:
    def publicMethod(self): # 第一个参数必须是self
    ...
  • 保护方法的写法:

    1
    2
    3
    class Test:
    def _protectedMethod(self): # 保护方法声明最前面必有单“_”
    ...
  • 私有方法和私有属性的写法:

    1
    2
    3
    4
    class Test:
    __privateAttribute = 123 # 私有变量的写法,最前面必有“__”
    def __privateMethod(self): # 私有方法的写法,最前面必有“__”
    ...
  • 特殊方法和特殊变量的写法:一般数系统定义的名字,如:__init__()__doc__

    1
    2
    3
    class Test:
    def __specialMethod__(): # 特殊方法一般都是左右各有“__”
    ...

创建类

1
2
3
4
5
6
7
8
9
class ClassName:
"""类的文本说明""" # 属于一个类的__doc__属性,可以在外部被调用
def __init__(self): # 类的构造函数,是自己定义的,第一个参数比为self;其他参数根据函数的定义决定
pass
def __def__(self): # 类的析构函数,是自己定义的,非必须。用于实例死亡时调用。只有一个self参数
pass
def __str__(self): # 可写可不写,重载输出格式
pass
def __cmp__(self): # 可写可不写,重载

类继承

继承的语法:

1
2
class SubClass(ParentClass1, ParentClass2, ...):
...

在python中继承中的一些特点:

  • 如果在子类中需要父类的构造方法就需要显式的调用父类的构造方法,或者不重写父类的构造方法
  • 在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
  • Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)

如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。

子类构造函数的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Father(object):
theid = 123 # 类的静态变量是写在函数外面的
def __init__(self, name):
self.name=name
print ( "name: %s" %( self.name))
def getName(self):
return 'Father ' + self.name

class Son(Father):
def __init__(self, name):
super(Son, self).__init__(name) # 在重写了__init__()后又要使用父类构造函数的方法
print ("hi")
self.name = name
def getName(self):
return 'Son '+self.name

方法重写

当子类继承了父类的方法后,可以在有需要时,对父类的方法重写。即重新定义同名函数的不同过程。

在Python里面,重写默认是晚绑定,所以不用担心多态问题。

重载操作符

Python 的运算符重载非常方便,只需要重写对应的特殊方法。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Point:

def __init__(self, x, y):
self.x = x
self.y = y

def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)

def __str__(self):
return "({},{})".format(self.x, self.y)


a = Point(1, 2)
b = Point(2, 3)
print(a)
print(b)
print(a + b)

常见的可重载运算符

一元运算符

image-20220401120655364

二元运算符

image-20220401120733476

比较运算符 image-20220401120808052

类的内置方法

由对象寻找类:

  • issubclass(className1, className2):返回布尔类型,判断className1是否是className2的子孙类
  • isinstance(obj, Class):返回布尔类型,判断obj是否为Class的实例
  • type(obj):返回一个type对象,描述的是obj的类

对对象和类的属性进行操作:

  • hasattr(obj, str):返回布尔对象,判断obj中是否有某个属性(obj可以是类或者对象,以下同理);str是描述这个属性的名字字符串

  • defattr(obj, str):参数解释同上。删除obj中的str

  • setattr(obj, str, newAttr):参数解释同上。用新的属性newAttr替换str所描述的属性。变量和函数都可以换

  • getattr(obj, str):参数解释同上。如果该属性是变量,则获得变量;如果该属性是一个函数,则可以通过在后面加()来调用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class Test:
    def __init__(self, name):
    self.name = name

    def out(self, sth):
    print(self.name + " is " + sth)


    t = Test('test')
    getattr(t, 'out')('a test')


    def show():
    print('new func')


    setattr(t, 'out', show)
    getattr(t, 'out')()

    # 结果是:
    # test is a test
    # new func

类的内置属性

  • __dict__: 类的属性(包含一个字典,由类的数据属性组成)
  • __doc__:类的文档字符串
  • __name__: 类名
  • __module__: 类定义所在的模块(类的全名是__main__.className,如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod
  • __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

正则表示

正则表达式是一个__特殊的字符序列__,它能帮助你方便的__检查一个字符串是否与某种模式匹配__。

可以理解为匹配符合某种模式的字符串。

工具包——re模块

Python标准库里面的模块。提供多种处理字符串以及正则表达式的处理手段可以用各种方法来对其操作。

正则

网络连接

使用标准库——socket包

-------------本文结束 感谢您的阅读-------------