python-类

意义:归类,组织数据结构

1.多态:不需要关心对象的类型

2.封装:属于对象自己的变量

3.继承:继承父类的属性方法

所有单词首字母都大写

1
2
3
4
5
6
class StudentName():
__name="tangchao"
def __getname(self):
return self.__name
def setname(self):
self.__name=name

私有属性方法

1.类会创建独立的命名空间,self参数指代的是所创建的对象实例自身。每当调用类的方法时,就将对象自身(用self来指示)作为一个参数传入。self不是关键字,其实用其他的命名也是可以的。

2.私有属性(变量)和方法以两个下划线开头

3.私有方法(以及变量)通过直接调用是无法访问的,但是可以通过下划线加类名来访问

1
2
3
4
5
a=Student()
a.name #获取不到
a.getname() #获取不到
a._Student__name #可以获取到
a._Student__getname() #可以获取到

对象属性何时创建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Member():
count = 1
def init(self):
Member.count+=1

a = Member()
b = Member()
a.init
print(a.count)
2
print(b.count)
2
b.init
print(a.count)
3
print(b.count)
3

可以看出a和b都是访问的同一个属性count,那么对象创建时并没有克隆一份自己的变量,仍然引用类的属性。

但是如果对属性赋值,那么对象会克隆一份自己的属性

1
2
3
4
5
a.count='Two'
print(a.count)
Two
print(b.count)
3

继承

1
2
3
4
5
class Teacher(Member):
def init(self, count):
self.count = count

a = Teacher()
  1. 在类名的后面添加要继承的类的名字

  2. 继承以后可以改写父类的方法

  • 查看是否为继承关系

    1
    issubclass(Teacher, Member)
  • 访问父类

    1
    Teacher.__bases__
  • 查看对象是否为类的实例

    1
    2
    isinstance(a,Teacher)
    isinstance(a,Member)

接口

实现特定的功能,定义方法,被子类继承。需要被实现,如果不实现,那么只能被继续继承。

  • 访问a对象是否有方法init方法要用引号括起来

    1
    2
    hasattr(a, 'init')
    getattr(a,'init',None)
  • 查看对象存储的所有值

    1
    a.__dict__
    1
    2
    3
    import datetime as dt

    print(dt.__dict__)

抽象基类

不能被实例化的类(建议),定义子类应该实现的一组抽象方法:

1
2
3
4
5
6
7
8
9
10
from abc import ABC, abstractmethod

class XiaoFenDui(ABC):
@abstractmethod
def get_name(self):
pass

@abstractmethod
def set_name(self,name):
pass
  • 其中@abstractemthod为装饰器,用来标记抽象,指定在子类中必须实现的方法

  • 抽象类只能被继承,不能实例化。主要用来作为一种规范。

    1
    2
    class GamePlay(XiaoFenDui):
    pass
  • 如果没有实现父类的方法,那么它也只能被继承。不能实例化。

鸭子模型

1.实现超类的方法(至少是爷爷辈的)

只要实现了XiaoFeiDui的方法,即使不是它的对象,也可以认为是XiaoFeiDui的子类

1
2
3
4
5
6
7
8
9
class Play(GamePlay):
def get_name(self):
return self.name

def set_name(self,name):
self.name = name

st1 = Play()
isinstance(st1, XiaoFenDui)

2.注册为其子类

即使没有继承以及实现父类的方法,只要注册为XiaoFenDui的子类,同样被视为它的子类

1
2
3
4
5
6
7
8
class FakePlay():
def calc(self,num):
return num += 1

XiaoFenDui.register(FakePlay)
c = FakePlay()
print(issubclass(FakePlay,XiaoFenDui))
print(isinstance(c, XiaoFenDui))

3.鸭子模型的思考

为什么需要鸭子模型呢?可能在别的语言看来这是不严谨的语法,大多数人是这么说的,于是我们也这么认为。但是不严谨带来的后果是啥?有人说的出来吗,但是我知道python的这种鸭子模型的优势:这么做的意义在于可以继承父类,那么也就拥有了其属性和方法。大大简化了语法,就像我们为什么要写一个函数一样,还不是为了避免写重复的东西浪费时间与字数。写个函数几个字就可以拿来引用那一段函数了。同样类也是一样,只不过其更大了,因为它包括了函数,它是一系列函数和属性的集合。

所以我们在写一个程序的时候最先应该做的不是动手去写,而是应该思考如何架构。是写一个类,一个函数,还是一个lambda表达式?或者这些都不用。思考好了永远要好一些,至少思路更加清晰。思考胜于动手啊!