Python面向对象编程

什么是对象

世间万物皆对象

面向对象编程

把我们生活中的对象以及对象之间的关系模拟到程序中。
目的是为了让程序完成生活中的一些事情。

如何模拟

  • 属性
  • 方法:动作(行为)

如何编程

1.类:就是一个模板,设计属性和方法。
2.对象:也叫类的实例化,类的实体。
3.通过对象调用属性和方法。

格式:

class 类型:
类的主体

举例:

class Person:

属性

def init(self,n,s,a): # __init__构造方法
self.name = n
self.sex = s
self.age = a

方法

def run(self):
print("跑步")

def study(self):
print("学习")

if name == 'main':
p = Person("路飞","男","18") # 创建对象时默认会调用构造方法
print(p.name,p.age+10,p.sex)
p.run()
p.study()

类的属性和方法的种类

属性(类属性,实例属性,内置属性)
方法(类方法,实例方法,内置方法,静态方法)

class Person:

实例属性

def init(self,n,s,a): # __init__构造方法
self.name = n
self.sex = s
self.age = a

类属性(类属性由类名调用)

code=100

内置属性:是类自带的不需要定义,本质也是类属性。

print(Person.dict)

print(Person.doc)

print(Person.name)

__init__是构造方法,在初始化对象时自动调用。作用是:初始化实例属性。

self是当前类的对象。类似于java中的this。具体是:谁调用了带有self的方法,那么self就是那个对象。self不需要传参。

实例方法

def run(self):
print("跑步"+self.name)

def study(self):
print("学习")

类方法:必须有装饰器@classmethod,并且第一个参数是cls,cls代表当前类

类方法是用于操作类属性的,不能操作实例属性。

@classmethod #装饰器
def setCode(cls,c):
cls.code = c;

@classmethod # 装饰器
def getCode(cls):
return cls.code

静态方法(必须有装饰器@staticmethod,它既没有self也没有cls,其实就是一个函数)

@staticmethod
def smthod():
print("我是静态方法")

if name == 'main':
# p = Person("路飞","男","18") # 创建对象时默认会调用构造方法
# print(p.name,p.age+10,p.sex)
# p.run()
# p.study()

s = Person("鸣人", "男", 18) # 创建对象时默认会调用构造方法

s.run()

print(Person.dict)

print(Person.doc)

print(Person.name)

Person.setCode(300)

print(Person.getCode())

p = Person("路飞", "男", 18)

p.smthod()

属性和方法的私有化

在属性和方法的前面加上__表示对属性和方法私有化。
原则上只能在本类调用,在其他类无法调用。
但是python提供了对象,__类名__属性名(__方法名)的机制访问私有属性和方法。

class Test:
def test_private(self):
p=Person("路飞","男",18)
#print(p.age,p.sex)
#print(p._Person__name)
#p.study()
#p._Person__run()

if name == 'main':
t = Test()
t.test_private()

面向对象编程的三大特性

1.封装
第一层含义:把属性和方法放入一个类作为模板就是一种封装。
第二层含义:把属性和方法私有化也是一种封装。

2.继承的特点
1)在Python中,如果父类和子类都重新定义了构造方法__init__( ),在进行子类实例化的时候,子类的构造方法不会自动调用父类的构造方法,必须在子类中显示调用。
Parent.init(self,n)

2)如果需要在子类中调用父类的方法:可以使用self.方法名()或者是super().方法名()
3)当出现重写时,Python总是首先查找子类,然后在查找父类,然后在查询爷爷类,以此类推。
4)父类私有的属性和方法不能被继承。
5)Python支持多继承。
6) 继承当中的两个方法。
print(isinstance(c,Child)) #判断一个对象是否是一个类的实例。
print(issubclass(Child,Parent)) #判断一个类是否是另一个类的子类。

class Parent:
def init(self,n):
self.name = n
print("这是父类的构造方法")

def study(self):
print("父类学习的方法"+self.name)

class Child(Parent):
def init(self,n):
#如果想要继承父类的属性,那么必须在子类的构造方法中手动的调用父类的构造方法。
Parent.init(self,n)
print("这是子类的构造方法")

def child_func(self):
print("这是子类的方法"+self.name)

if name == 'main':
c = Child("张三")
#c.child_func()
c.study()

  1. 重写和重载
    重写:子类重写父类的方法,方法名,参数都相同。
    重载:是在一个类中,方法名相同,参数的个数,类型,顺序不一样。python不支持。

3.多态
同样的行为(方法)因为执行者不一样而得到不同的结果,呈现多种形态叫多态。
作用是:提高程序的扩展性。

class weixin:
def zhifu(self):
print("通过微信支付")

class zhifubao:
def zhifu(self):
print("通过支付宝支付")

class yinlian:
def zhifu(self):
print("通过银联支付")

开始支付(多态)

def start_pay(obj):
obj.zhifu()

if name == 'main':
#创建三个对象
wx = weixin()
zfb = zhifubao()
yl = yinlian()
#调用
start_pay(wx)

------------------

class mysql:
def add_product(self):
print("通过mysql的insert语句增加")
class oracle:
def add_product(self):
print("通过oracle的insert语句增加")
class sqlserver:
def add_product(self):
print("通过sqlserver的insert语句增加")
#增加(多态)
def add(obj):
obj.add_product()
if name == 'main':
#创建三个对象
ms = mysql()
ol = oracle()
ss = sqlserver()
#调用
add(ol)

posted @ 2019-11-15 08:00  心脏鼓点  阅读(324)  评论(0)    收藏  举报