面向对象
一、面向对象代码示例:
1 class Test(): #类的定义 2 car = "buick" #类变量,定义在类里方法外,可被对象直接调用,具有全局效果 3 def __init__(self): #构造方法 4 self.name = 1 #成员变量,可以在类的不同方法间调用,也可以由类创建的对象进行调用 5 print("name=",self.name) 6 7 def say(self): #类方法必须包含参数self,且为第一个参数 8 address = "china" #方法中的局部变量 9 print("address=",address) 10 11 self.address = address #局部变量可以在类方法间使用 12 13 def cry(self): 14 print(self.address) #打印上面局部变量 15 16 @staticmethod #静态方法可以被类名直接调用 17 def fun1(): 18 print("我是静态方法") 19 20 t = Test() #t为类创建的对象 21 # print(t.car) #打印类变量 22 t.say() 23 t.cry() 24 Test.fun1() 25 #方法(函数)、类变量、成员变量(init)、局部变量(def)
二、类的继承,子类可以使用父类的方法,父类不可以使用子类的方法
三、方法重写:调用最新的方法
1 class Parent(): 2 def myMthod(self): 3 print("父类的方法") 4 5 class Cjild(Parent): 6 def myMthod(self): 7 print("子类的方法") 8 9 c = Cjild() 10 c.myMthod() #先调用自己的方法,也叫做方法重写
四、私有变量和方法
1 class Info(): 2 def __init__(self): 3 self.__name = 'xiaojia' #私有变量(一般只能在类内部使用) 4 5 def say(self): 6 print(self.__name) #类的内部调用 7 8 a = Info() 9 # print(a.__name) #类的外部调用报错,无法调用 10 print(a._Info__name) #注意:可以用a._Info__name这样的方式在类的外部调用,这就是python的灵活性
迭代器
1 #迭代器一次返回一个成员 2 list1 = [1,2,3,4] 3 it = iter(list1) #创建一个对象并赋值给it 4 print(next(it)) #1 5 print(next(it)) #2 6 print(next(it)) #3 7 print(next(it)) #4
range和切片的比较:
range:
1 range(strat,end,step) 2 range(4) range(0,4) range(0,4,1) 3 range(-3,3) 4 range(3,-3,-1) 5 6 range(-3,3,-1) #输出为空 7 range(0,4,-1) #输出为空 8 range(3,2,1) #输出为空
切片:
1 a[start,end,seq] 2 seq如果为正,从左往右走,如果start大于end显示为空 3 seq如果为负,从右往左走,如果start小于end显示为空 4 如果start为空,表示从头开始走 5 如果end为空,表示走到末尾 6 如果start和end都为空,取全部
如下 标记位:
# 0 1 2 3
# a b c d
# -4 -3 -2 -1
练习:
1 求圆的面积和周长 2 from math import pi 3 class Shape(): 4 def getArea(self,r): 5 print("圆的面积是:%.2f"%(pi*(r**2))) 6 7 def getLong(self,r): 8 print("圆的周长是:%.2f"%(2*pi*r)) 9 10 y = Shape() 11 y.getArea(5) 12 y.getLong(5)
1 统计员工信息和工资 2 class Employee: 3 4 count = 0 5 def __init__(self,name,salory): 6 self.name = name 7 self.salory = salory 8 self.count += 1 9 10 def emp_info(self): 11 print("name=",self.name,"salory=",self.salory) 12 13 def emp_count(self): 14 print("num=",self.count) 15 16 u = Employee('jia',100) 17 u.emp_count() 18 u.emp_info() 19 u = Employee('yannan',30000) 20 u.emp_count() 21 u.emp_info()
思考面向对象的执行顺序:
1 class Test(): 2 s = "我是一个类变量,嘎嘎" 3 4 def __init__(self): 5 print("构造方法就是初始化,来一下") 6 self.a = 1 #可以由类创建的对象调用 7 self.b = 28 8 9 def __del__(self): 10 print("析构方法就是后期收拾残局的,我来") 11 12 def foo(self): 13 print("方法内的普通成员") 14 15 @staticmethod 16 def baba(): 17 print("类的静态方法,我可以被类名直接调用哦,来来") 18 19 t = Test() #创建一个对象,对象啊对象 20 ''' 21 思路: 22 init和del在类中仅且执行一次,init是初始化(先勤部队)del是收拾残局(后勤部队) 23 不管是几个方法的调用都会执行下init和del 24 ''' 25 t.foo() #如果单独执行打印init和del,中间打印foo 26 Test.baba() #如果单独执行打印init和del,中间打印baba 27 print(Test.s) #如果单独执行打印init和del,中间打印s 28 29 #如果一起执行打印的顺序是:init、foo、baba、s、del