week7-python之面向对象

Python 面向对象

概述

  • 面向过程:根据业务逻辑流水线的方式写代码
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对某些功能属性进行归类,数据封装,然后在进行实例化等提高开发效率等

类和实例

类(Class)和实例(Instance)是面向对象最重要的概念。

类是指抽象出的模板。实例则是根据类创建出来的具体的“对象”,每个对象都拥有从类中继承的相同的方法,但各自的数据可能不同。

在python中定义一个类:

class Student(object):
    pass

关键字class后面跟着类名,类名通常是大写字母开头的单词,紧接着是(object),表示该类是从哪个类继承下来的。通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承下来的类。

定义好了 ,就可以根据Student类创建实例:

class Student(object):
         pass

bar = Student() # bar是Student()的实例

类的数据属性和类的函数属性介绍 

class OldboyStudent:
    school = 'oldboy' #类的数据属性/类的变量 可以节约内存空间,每个实例都可以调用,数据存放类的内存空间,不需要在存放在每个实例的内存空间
    def learn(self): #类的函数属性/类的方法
        print('is learning')

    def eat(self):
        print('is eating')
    print('======>')

# 类体的代码在类定义阶段就会执行,理所应当会产生类的名称空间,用__dict__属性查看
print(OldboyStudent.__dict__)
print(OldboyStudent.__dict__['school'])
print(OldboyStudent.__dict__['learn'])
类的属性操作
print(OldboyStudent.school)
print(OldboyStudent.learn)

def func():pass
print(func)
OldboyStudent.learn(123)

OldboyStudent.x=1111111111111111111111
OldboyStudent.school='Oldboy'
del  OldboyStudent.school
print(OldboyStudent.__dict__)

OldboyStudent.__dict__['x']=1111111111111111111111
产生程序中的对象:类名加括号,调用类,产生一个该类的实际存在的对象,该调用过程称为实例化,产生的结果又可以成为实例
class OldboyStudent:
    school = 'oldboy' #类的变量 存放在类的内存空间,所有实例化的对象优先访问实例里面的变量,如果实例里面的内存空间没有找到再到 类的内存空间查找
    #obj1,'李大炮',18,'女'
    def __init__(self,name,age,sex): #在实例化时,产生对象之后执行
        # if not isinstance(name,str):
        #     raise TypeError('名字必须是字符串类型')
        self.name=name  #实例变量,保存在调用实例的内存空间中,与其他实例内存空间是独立的,但是可以通过实例调用访问其他实例的内存空间
        self.age=age
        self.sex=sex
        # return None #__init__方法必须返回None
        #obj1.name='李大炮'
        #obj1.age=18
        #obj1.sex='女'

    def learn(self):
        print('is learning')

    def eat(self):
        print('is eating')

 分析:

obj1=OldboyStudent('李大炮',18,'女') #
分两步:
第一步:先产生一个空对象obj1
第二步:OldboyStudent.__init__(obj1,'李大炮',18,'女')
print(obj1.__dict__)

obj2=OldboyStudent('张全蛋',28,'男')
obj3=OldboyStudent('牛榴弹',18,'女')

print(obj2.__dict__)
print(obj3.__dict__)
对象可以访问类的数据属性,结论:类的数据属性共享给所有对象使用,id对一样
class OldboyStudent:
    # school = 'oldboy'

    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def learn(self):
        print('%s is learning'  %self.name)

    def eat(self):
        print('is eating')

obj1=OldboyStudent('李大炮',18,'女')
obj2=OldboyStudent('张全蛋',28,'男')
obj3=OldboyStudent('牛榴弹',18,'女')
print(obj1.name,obj1.age,obj1.sex)

print(obj1.school,id(obj1.school))
print(obj2.school,id(obj2.school))
print(obj3.school,id(obj3.school))
print(OldboyStudent.school,id(OldboyStudent.school))
类的函数属性是绑定给所有对象使用的,绑定给不同的对象是不同的绑定方法,绑定方法有特殊之处。
OldboyStudent.learn(obj1)
OldboyStudent.learn(obj2)
OldboyStudent.learn(obj3)
print(obj1.learn)
print(obj2.learn)
print(obj3.learn)
print(OldboyStudent.learn)
绑定方法:绑定给谁,就由谁来调用,谁来调用就把“谁”本身当做第一个参数传入
obj1.learn() #OldboyStudent.learn(obj1)
obj2.learn() #OldboyStudent.learn(obj1)
obj3.learn() #OldboyStudent.learn(obj1)
属性查找顺序:先从对象的__dict__中找,然后到类的__dict__中找,然后父类....
OldboyStudent.school='哈佛'
obj1.school='hahahahahahahhahahahahahah'
print(obj1.__dict__)
print(obj1.school)
print(obj2.school)
print(obj3.school)
class Foo:
    count=0
    def __init__(self,x,y,z):
        self.x=x
        self.y=y
        self.z=z
        Foo.count+=1
obj1=Foo(1,1,1)
obj2=Foo(1,2,1)
obj3=Foo(1,2,3)

print(obj1.count)
print(Foo.count)

class OldboyStudent:
    # school = 'oldboy'

    def __init__(self,name,age,sex='male'):
        self.name=name
        self.age=age
        self.sex=sex

    def learn(self):
        print('%s is learning'  %self.name)

    def eat(self,y):
        print('is eating')

obj1=OldboyStudent('李大炮',18)
OldboyStudent.eat()
obj1.eat(1)
obj1.learn()

classmethod和staticmethod使用

setting.py

HOST='192.168.31.1'
PORT=3106

操作:

import settings
import uuid
class MySql:
    def __init__(self,host,port):
        self.host=host
        self.port=port
        self.id=self.create_id()

    # @classmethod
    # def from_conf(cls): #绑定给类的
    #     print(cls)
    #     # return cls(settings.HOST,settings.PORT)
    #
    # def func1(self): #绑定给对象的
    #     pass

    @staticmethod
    def create_id(): #非绑定方法
        return str(uuid.uuid1())


conn1=MySql('127.0.0.1',3306)
conn2=MySql('127.0.0.2',3306)
conn3=MySql('127.0.0.3',3306)
# print(MySql.create_id)
# print(conn1.create_id)

print(conn1.id,conn2.id,conn3.id)

 测试

import time
class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
    # @staticmethod
    # def now():
    #     t=time.localtime()
    #     return Date(t.tm_year,t.tm_mon,t.tm_mday)

    @classmethod #改成类方法
    def now(cls):
        t=time.localtime()
        return cls(t.tm_year,t.tm_mon,t.tm_mday) #哪个类来调用,即用哪个类cls来实例化

class EuroDate(Date):
    def __str__(self):
        return 'year:%s month:%s day:%s' %(self.year,self.month,self.day)

e=EuroDate.now()
print(e)

类的继承:

1 继承的功能之一:解决类与类之间的代码重复问题
2 继承是类与类之间的关系,是一种,什么是什么的关系
3 在子类派生出的新的属性,已自己的为准
4 在子类派生出的新的方法内重用父类的功能的方式:指名道姓法OldboyPeople.__init__ 这种调用方式本身与继承是没有关系
继承的基本形式:
class ParentClass1(object): #定义父类
    pass
class ParentClass2: #定义父类
    pass
class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
    pass
class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
    pass
print(SubClass1.__bases__)
print(SubClass2.__bases__)
print(ParentClass1.__bases__)  
在python中有经典类与新式类的区别:
python2 经典类就按深度优先来继承的,新式类式按广度优先来继承的
python3 经典类和新式类都是统一广度优先来继承的
继承的实现原理演示:
#单继承
class A:
    def f1(self):
        print('A.f1')

    def f2(self):
        print('A.f2')
        self.f1() #b.f1()

class B(A):
    def f1(self):
        print('B.f2')


b=B()
# b.f2=111111
b.f2()

#多继承
class J:
    def test(self):
        print('J')
class A(J):
    # def test(self):
    #     print('A')
    pass
class E(J):
    def test(self):
        print('E')
    pass
class H(J):
    def test(self):
        print('H')

class G(H):
    def test(self):
        print('G')
    pass
class B(A):
    # def test(self):
    #     print('B')
    pass
class D(E):
    def test(self):
        print('D')
    pass
class F(G):
    def test(self):
        print('F')
    pass
class C(B,D,F):
    # def test(self):
    #     print('C')
    pass

c=C()
# c.test=1111
# c.test()
#MRO列表
print(C.mro())

 子类的方法重用父类的功能super

class OldboyPeople:
    school = 'oldboy'
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def eat(self):
        print('is eating')
    def teach(self):
        print('这是父类的teach')

class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,salary,title):
        # OldboyPeople.__init__(self,name,age,sex)
        #在Python2中需要写全:super(OldboyTeacher,self)
        super().__init__(name,age,sex)
        self.salary=salary
        self.title=title

    def teach(self):
        # OldboyPeople.teach(self)
        super().teach()
        print('%s is teaching'  %self.name)
print(OldboyTeacher.mro())

egon_obj=OldboyTeacher('egon',18,'male',3.1,'沙河扛把子')
# print(egon_obj.title)
# print(egon_obj.__dict__)
egon_obj.teach()

class A:
    def test(self):
        super().test()
class B:
    def test(self):
        print('B')
class C(A,B):
    pass
# a=A()
# a.test()
print(C.mro())
c=C()
c.test()

 类的组合应用

class OldboyPeople:
    school = 'oldboy'
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex

    def eat(self):
        print('is eating')

class OldboyStudent(OldboyPeople):

    def __init__(self,name,age,sex):
        OldboyPeople.__init__(self,name,age,sex)
        self.course=[]

    def learn(self):
        print('%s is learning'  %self.name)

class OldboyTeacher(OldboyPeople):
    def __init__(self,name,age,sex,salary,title):
        OldboyPeople.__init__(self,name,age,sex)
        self.salary=salary
        self.title=title
        self.course=[]

    def teach(self):
        print('%s is teaching'  %self.name)

class Course:
    def __init__(self,course_name,course_period,course_price):
        self.course_name=course_name
        self.course_period=course_period
        self.course_price=course_price
    def tell_info(self):
        print('<课程名:%s 周期:%s 价格:%s>' %(self.course_name,self.course_period,self.course_price))

python=Course('Python','6mons',3000)
linux=Course('Lnux','3mons',2000)
bigdata=Course('BigData','1mons',1000)
# python.tell_info()
egon_obj=OldboyTeacher('egon',18,'male',3.1,'沙河霸道金牌讲师')
#
# egon_obj.course.append(python)
# egon_obj.course.append(linux)
#
# for obj in egon_obj.course:
#     obj.tell_info()
yl_obj=OldboyStudent('yanglei',28,'female')
yl_obj.course.append(python)
for i in yl_obj.course:
    # print(i.course_name,i.course_period,i.course_price)
    i.tell_info()
posted @ 2017-08-18 09:20  warren1236  阅读(119)  评论(0)    收藏  举报