Python基础语法 - 面向对象

描述

  面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。

  类就是一个模板,模板里可以包含多个函数,函数里实现一些功能

  对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

如何创建类
  class 类名:
    pass

创建方法
  构造方法,__init__(self,arg)
    obj = 类('a1')
  普通方法
    obj = 类(‘xxx’)
    obj.普通方法名()

1. 面向对象三大特性之一:封装

class Bar:
    def __init__(self, n,a):
        self.name = n
        self.age = a
        self.xue = 'o'

b1 = Bar('alex', 123)

b2 = Bar('eric', 456)

适用场景:
  如果多个函数中有一些相同参数时,转换成面向对象

class DataBaseHelper:

    def __init__(self, ip, port, username, pwd):
        self.ip = ip
        self.port = port
        self.username = username
        self.pwd = pwd

    def add(self, content):
        # 利用self中封装的用户名、密码等   链接数据
        print('content')
        # 关闭数据链接

    def delete(self, content):
        # 利用self中封装的用户名、密码等   链接数据
        print('content')
        # 关闭数据链接

    def update(self, content):
        # 利用self中封装的用户名、密码等   链接数据
        print('content')
        # 关闭数据链接

    def get(self, content):
        # 利用self中封装的用户名、密码等   链接数据
        print('content')
        # 关闭数据链接


s1 = DataBaseHelper('1.1.1.1', 3306, 'alex', 'sb')
View Code

 

2. 面向对象三大特性之二:继承

1. 继承
class 父类:
  pass
class 子类(父类):
  pass

2. 重写
  防止执行父类中的方法

3、self永远是执行改方法的调用者

4.

  super(子类, self).父类中的方法(...)
  父类名.父类中的方法(self,...)

5、Python中支持多继承

  a. 左侧优先
  b. 一条道走到黑
  c. 同一个根时,根最后执行

3. 面向对象三大特性之三:多态

====> 原生多态

# Java(伪代码)
string v = 'alex'
        
def func(string arg):
    print(arg)
            
    func('alex')
    func(123)    #报错
    
# Python 
v = 'alex'
        
def func(arg):
    print(arg)
            
func(1)
func('alex')

 类的成员:字段

class Foo:

  #静态字段
  variable = abc
  
  def __init__(self, name):
        # 普通字段
        self.name = name

  # 普通方法
  def show(self):
    print(self.name)

obj = Foo('alex')
obj.name
obj.show()

 

类成员:
# 字段
- 普通字段,保存在对象中,执行只能通过对象访问
- 静态字段,保存在类中, 执行可以通过对象访问 也可以通过类访问

# 方法
- 普通方法,保存在类中,由对象来调用,self -- > 对象
- 静态方法,保存在类中,由类直接调用
- 类方法,保存在类中,由类直接调用,cls -- > 当前类

应用场景:
  1. 如果对象中需要保存一些值,执行某功能时,需要使用对象中的值 -> 普通方法
  2. 不需要任何对象中的值,静态方法

类的成员:属性

class Foo:
    @property    #obj.per
    def per(self):

        return 123

    @per.setter    #obj.per = 123
    def per(self, val):
        print(val)

    @per.deleter    #del obj.per
    def per(self):
        print(666)


obj = Foo()
obj.per
obj.per = 123
del obj.per

 示例:页码切换

class Pergination:

    def __init__(self, current_page):
        try:
            p = int(current_page)
        except Exception as e:
            p = 1

        self.page = p
    @property
    def start(self):    #定义每页开始方法
        val = (self.page-1) * 10
        return val

    @property
    def end(self):  #定义每页结束方法
        val = self.page * 10
        return val

li = []
for i in range(1000):
    li.append(i)

while True:
    p = input('请输入要查看的页码:') # 1,每页显示10条
    obj = Pergination(p)
    print(li[obj.start:obj.end])
View Code

 

另一种方法,分别对应@property @per.setter @per.deleter ,并与之同理

class Foo:

    def f1(self):
        return 123
    def f2(self,v):
        print(v)
    def f3(self):
        print('del')

    per = property(fget=f1,fset=f2,fdel=f3,doc='abc')

obj = Foo()
ret = obj.per
print(ret)  #1

obj.per = 123456  #2

del obj.per  #3

成员修饰符

  共有成员

  私有成员,__字段名

    无法直接访问,只能间接访问

普通字段 / 静态字段

class Foo:
    __val = 'abc'
    def __init__(self,name,age):
        self.name = name
        # self.age = age
        self.__age = age #私有,外部无法直接访问

    def show(self): #间接访问
        return self.__age

    def show1(self):
        return Foo.__val

    @staticmethod
    def stat():
        return Foo.__val
obj = Foo('alex',18)
print(obj.name) #alex
# print(obj.age)  #18
print(obj.__age) #AttributeError: 'Foo' object has no attribute '__age'
ret = obj.show()
print(ret) #18
ret = obj.show1()
print(ret) #abc
ret = Foo.stat()
print(ret) #abc
View Code

普通方法 / 静态方法 / 特殊方法

class Foo:

    def __f1(self):
        return 123

    def f2(self):
        return self.__f1()
        return r
obj = Foo()
ret = obj.f1()
print(ret) #'Foo' object has no attribute 'f1'

ret = obj.f2()
print(ret) #可以访问
View Code
  • 不能继承私有字段,不能访问

特殊成员

__init__

__call__

class Foo:
    def __init__(self):
        print('init')

    def __call__(self, *args, **kwargs):
        print('call')


obj = Foo() # Foo()自动执行__init__方法

obj() 
#相当于 Foo()()
#obj()自动执行__call__方法
View Code

__str__

__init__

__del__

__add__

__dict__ # 讲对象中封装的所有内容通过字典的形式返回

__getitem__ # 切片(slice类型)或者索引

__setitem__

__delitem__

__iter__

# 如果类中有 __iter__ 方法,对象=》可迭代对象
# 对象.__iter__() 的返回值: 迭代器
# for 循环,迭代器,next
# for 循环,可迭代对象,对象.__iter__(),迭代器,next
# 1、执行li对象的类F类中的 __iter__方法,并获取其返回值
# 2、循环上一步中返回的对象

 

mataclass

 

posted @ 2018-03-23 02:27  皮蛋小顽童  阅读(154)  评论(0编辑  收藏  举报