python面向对象

Python是一门向对象的语言,万物皆对象;

1、对象的特性是:属性和方法,python通过类来定义对象的属性和方法

#定义类;
class Person: #定义经典类
class Person(object): #定义新式类 def __init__(self,name,sex): self.name = name #属性
self.sex = sex
def cry(self): #方法 print('%s cry....'%self.name) def eat(self): print('color',self.sex) ccx = Person('常彩霞','','黑色') #创建对象,即类的实例化 ccx.eat() #访问对象的方法

 2、self参数

self 参数是对类的当前实例的引用,用于访问属于该类的变量

class Person:
  def __init__(self, name, age):
    self.name = name
    self.age = age

  def myfunc(abc):
    print("Hello my name is " + self.name)

p1 = Person("Bill", 63)

 3、__init__,构造函数;__del__析构函数

class Foo:

    def __init__(self):
        print('构造方法被调用')   #初始化方法,创建完对象后会自动被调用

    def __del__(self):
        print('脚本运行结束, 释放内存')  #析构方法,当对象被删除时,会自动被调用,然后释放内存

4、实例方法、类方法和静态方法

class straff:
    nation = 'china'  #类变量
    def __init__(self,name,position,salary):  #实例方法,必须带self
        self.name = name           #实例变量、成员变量
        self.position = position
        self.salary = salary

    @classmethod  #装饰器、可以视为一个函数
    def help(cls):  #类方法、cls就是类straff,一些公共的方法,就用类方法,类方法里面不能调用实例方法,不能调用实例变量
        print(cls.nation)
        cls.show()

    def myself(self):  #实例方法
        self.help()    #实例方法可以调用类方法
        print(self.nation)   #实例方法可以调用类变量
        print(self.name)
        self.show()

    # 静态方法,可以看成一个单纯的函数,和类本身没有关系,不能使用类或实例的任何属性和方法;类对象或实例对象都可以调用它
    @staticmethod
    def show():    #静态方法可以不带参数
        print('静态方法')

5、继承

class Car:
__key = 'value' #私有的变量和方法不能被继承
def __init__(self,wheel,direction): self.wheel = wheel self.direction = direction def run(self): print('向着 %s 前进 %s' %(self.direction,self.wheel)) class Bmw(Car): #继承 pass bmw = Bmw(4,'north') #实例化 bmw.run() #调用父类的方法 print(bmw.wheel) #调用父类的属性

6、重写父类的方法

class Car:
    def __init__(self,wheel,direction):
        self.wheel = wheel
        self.direction = direction

    def run(self):
        print('向着 %s 前进 %s' %(self.direction,self.wheel))

class Bmw(Car):  
     def run(self):    #覆盖重写父类的方法,父类的方法不会被调用
         print('重写父类的方法')

    def run(self):
        super().run()  #在父类的方法基础上修改
        print('重写父类的方法')

7、重写构造方法

class Car:
    def __init__(self,wheel,direction):
        self.wheel = wheel
        self.direction = direction

    def run(self):
        print('向着 %s 前进 %s' %(self.direction,self.wheel))

class Bmw(Car):  #继承
    def __init__(self,name,color):   #重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__
        self.name = name
        self.clor = color
    
    def __init__(self,name,color):  
        super(Bmw,self).__init__(name,color) #重写__init__,同时保留父类的构造方法
        self.name = name
        self.color = color
    def run(self):
        super().run()   
        print('向着 %s 前进 %s' %(self.name,self.color))

8、多重继承:一个子类可以同时获得多个父类的所有功能

class(A,B)#如果父类的方法重复,取前面的一个

9、多线程

线程:是一个程序,资源的集合,进程是在线程里面的,一个程序执行的最小单位

import threading
import time

def insert_db():   #定义一个线程函数
    time.sleep(3)
    print('insert_over')

threads = []
start_time = time.time()
for i in range(3):
    t = threading.Thread(target=insert_db)  # 创建3个线程,target指定线程执行的函数名   ## t = threading.Thread(target=run,args=('t1',)) args是函数对应的参数,以元组的形式存在
    t.start()  #启动线程
    threads.append(t)

#1线程执行完后自动结束,判断线程是否全部结束
for t in threads:
    t.join() # 告诉主线程,等子线程完成之后再执行

#2也可以判断线程数
while threading.activeCount() != 1:
    pass

end_time = time.time()
print('多线程执行的时间',end_time - start_time)
print('全部结束')

10、线程锁

由于线程之间是进行随机调度的,如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果的不可预期, 我们因此也称为“线程不安全”。

为了防止上面情况的发生,就出现了互斥锁(Lock)

import threading

count = 0
lock = threading.Lock()
def func():
    global count
    print('test-lock')
    lock.acquire()   #加锁
    count += 1
    lock.release()   #释放锁

for i in range(3):
    t = threading.Thread(target=func)
    t.start()

11、守护线程

设置为守护线程、一旦主线程结束,那么守护线程不管有没有执行完成,全部结束


import threading
import time
def talk(name):
    print('正在和%s聊天'%name)
    time.sleep(200)
def shipin(name):
    print('正在和%s视频'%name)
    time.sleep(300)

print("qq主窗口")
t1 = threading.Thread(target=talk,args=['刘小燕'])
t1.setDaemon(True) #设置线程为守护线程
t1.start()

t2 = threading.Thread(target=shipin,args=['蔡明昌'])
t2.setDaemon(True) #设置线程为守护线程
t2.start()

time.sleep(5)

print('结束。。。')


 
原文地址:https://www.cnblogs.com/whcp855/p/13129495.html