博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python基础学习18----面向对象简述
阅读量:6277 次
发布时间:2019-06-22

本文共 7503 字,大约阅读时间需要 25 分钟。

这里就不再讲面向对象的相关概念知识或者与面向过程的比较了,直接进入类的学习

1.类的创建

class people:    def __init__(self):#构造函数        passsfencs=people()#类的实例

2.封装

class people:    def __init__(self,name,age):        self.name=name        self.age=agesfencs=people("sfencs",19)print("%s is %d"%(sfencs.name,sfencs.age))

3.继承

class father:    def __init__(self):        self.a = 1        self.b = 2    def me(self):        print("i am father")        print(self)#<__main__.son object at 0x000001F7DFA11128>class son(father):    def __init__(self):        super().__init__()        super(son,self).me()#执行父类的me方法,但self是people    def me(self):        print("i am son")people=son()print(people.a)#1people.me()#i am son

子类可以对父类的方法进行重写,子类调用父类的方法使用super(子类名,self),self永远是执行该方法的调用者

python支持多继承

class father1:    def __init__(self):        self.a = 1        self.b = 2    def me(self):        print("i am father1")class father2:    def __init__(self):        self.c = 3        self.d = 4    def me(self):        print("i am father2")class son(father1,father2):    def __init__(self):        father1.__init__(self)        father2.__init__(self)        super(son,self).me()#i am father1    def me(self):        print("i am son")people=son()print(people.c)#3people.me()#i am son

多继承中子类调用父类方法的寻找方法是按照父类声明的顺序从左到右,从下到上查找,一直查找到最高级的父类,但是如果不同的父类继承于同一个父类,

那么这个相当于根的父类为最后再去查找

4.多态

python原生多态,不像java,c++那样必须在方法的形参处申明类型

5.静态字段与静态方法

sex="male"为静态字段,可以通过对象访问 也可以通过类访问

self.name=name    self.age=age 为普通字段只能通过对象访问

class people:    sex="male"    def __init__(self,name,age):        self.name=name        self.age=agesfencs=people("sfencs","19")print(sfencs.name)print(sfencs.sex)print(people.sex)

静态方法可以通过对象访问 也可以通过类访问,声明静态方法的方式为@staticmethod

class people:    sex="male"    def __init__(self,name,age):        self.name=name        self.age=age    @staticmethod    def func():        print("这是静态方法")sfencs=people("sfencs","19")sfencs.func()people.func()

类方法也可以通过对象访问 也可以通过类访问,声明类方法的方式为@classmethod,类方法的参数为类

class people:    sex="male"    def __init__(self,name,age):        self.name=name        self.age=age    @classmethod    def func(cls):        print("这是类方法")        print(cls)#
sfencs=people("sfencs","19")sfencs.func()people.func()

6.属性

属性定义的时候像方法,使用的时候像字段,使用@property声明,这样就可以使sfencs.func有对应的值

class people:    def __init__(self,name,age):        self.name=name        self.age=age    @property    def func(self):        return 1sfencs=people("sfencs","19")print(sfencs.func)#1

既然要伪装成字段,那么不仅仅是能够有对应的值,也应该能够为它赋值,将它删除等操作

class people:    def __init__(self,name,age):        self.name=name        self.age=age    @property    def func(self):        return 1    @func.setter    def func(self,val):        print(val)    @func.deleter    def func(self):        print("del")sfencs=people("sfencs","19")print(sfencs.func)#1sfencs.func=123del sfencs.func

 @func.setter为设置赋值的方法,@func.deleter为删除设置的方法。

经过这些设置之后,看似func成立一个字段,有了相应的特点,但其实这些特点都是假的。这三种方式只是3中对应关系,只是使用时是模仿字段操作,但真实操作是由

自己规定的,del并不能真的删除,而只是按照你所写的方法做相应的动作。

除此之外属性还有一种设置方式

class people:    def __init__(self,name,age):        self.name=name        self.age=age    def f1(self):        return 1    def f2(self,val):        print(val)    def f3(self):        print("del")    func=property(fget=f1,fset=f2,fdel=f3,doc="描述")sfencs=people("sfencs","19")print(sfencs.func)#1sfencs.func=123del sfencs.func

只是方式改变了,效果还一样,不多说了。

7.成员修饰符

这里就指将成员声明为私有的

class people:     def __init__(self,name,age):         self.name=name         self.__age=age     def getage(self):         return self.__age sfencs=people("sfencs","19") #print(sfencs.__age)私有成员不能直接通过对象来拿 print(sfencs.getage())#19

当然也有私有方法

class people:    def __init__(self,name,age):        self.name=name        self.__age=age    def getage(self):        return self.__age    def __fun(self):        print("这是私有方法")    def func(self):        self.__fun()sfencs=people("sfencs","19")#print(sfencs.__age)私有成员不能直接通过对象来拿print(sfencs.getage())#sfencs.__fun()sfencs.func()

在继承当中,私有成员与方法是不能被子类继承的

8.特殊成员方法

__init__

构造方法,这个不用过多解释

__del__

析构方法,当对象在内存中被释放时,自动触发执行

def __del__(self):    pass

__call__

对象后面加括号,触发执行

class people:    def __init__(self,name,age):        self.name=name        self.__age=age    def __call__(self,a,b):        print("__call__")        print(a,b)sfencs=people("sfencs",19)sfencs(1,2)

__int__

调用int(对象)时使用的方法

class people:    def __init__(self,name,age):        self.name=name        self.__age=age    def __int__(self):        return 10sfencs=people("sfencs",19)data=int(sfencs)print(data)#10

__str__

那么在打印 对象 时,默认输出该方法的返回值

class people:    def __init__(self,name,age):        self.name=name        self.__age=age    def __str__(self):        return "hello world"sfencs=people("sfencs",19)print(sfencs)#hello world

__add__

两个对象相加执行该方法

class people:    def __init__(self,name,age):        self.name=name        self.age=age    def __add__(self,other):        return self.age+other.agesfencs=people("sfencs",19)Tom=people("Tom",20)print(sfencs+Tom)#39

__dict__  

查看类或对象中的所有成员

class people:    sex="male"    def __init__(self,name,age):        self.name=name        self.age=agesfencs=people("sfencs",19)print(sfencs.__dict__)#{'name': 'sfencs', 'age': 19}print(people.__dict__)#{'__module__': '__main__', 'sex': 'male', '__init__': 
, '__dict__':
, '__weakref__':
, '__doc__': None}

__getitem__、__setitem__、__delitem__

用于索引操作,如字典。以上分别表示获取、设置、删除数据

class people:    def __init__(self,name,age):        self.name=name        self.age=age    def __getitem__(self, key):        print('__getitem__', key)        return 2    def __setitem__(self, key, value):        print('__setitem__', key, value)    def __delitem__(self, key):        print('__delitem__', key)sfencs=people("sfencs",19)sfencs["one"]=1#__setitem__ one 1print(sfencs["one"])#__getitem__ one  2del sfencs["one"]#__delitem__ one

__iter__

之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__
class people:    def __init__(self,list):        self.list=list    def __iter__(self):        return iter(self.list)sfencs=people([1,2,3,4,5])for i in sfencs:    print(i)

__module__ 和  __class__

表示当前操作的对象在那个模块

表示当前操作的对象的类是什么
class people:    def __init__(self,name,age):        self.name=name        self.age=agesfencs=people("sfencs",19)print(sfencs.__module__)#__main__print(sfencs.__class__)#

9.类的另一种创建方式

def f(self):    print(self.name,self.age)def __init__(self,name,age):    self.name = name    self.age = agepeople = type('people',(object,),{'func':f, '__init__':__init__})sfencs=people("sfencs",19)sfencs.func()

这种方式可以看出,类也是一种对象,是type类型的对象

我们可以从下面这张图看出类的实际创建过程

10.反射

反射可以通过字符串的方式来找到对象中的变量或方法

反射有4个方法getattr() hasattr() setattr() delattr()

class people:    def __init__(self,name,age):        self.name=name        self.age=agesfencs=people("sfencs",19)data1=getattr(sfencs,"name")print(data1)#sfencsdata2=hasattr(sfencs,"age")print(data2)#Truesetattr(sfencs,"age",20)print(sfencs.age)#20delattr(sfencs,"age")data3=hasattr(sfencs,"age")print(data3)#False

python一切事物皆是对象,模块同样也支持反射来操作

11.单例模式

对象也叫实例,单例模式表示该类只有一个对象

class ConnectPool:    __instatnce=None    @staticmethod    def get_instance():        if ConnectPool.__instatnce:            return ConnectPool.__instatnce        else:            ConnectPool.__instatnce = ConnectPool()            return ConnectPool.__instatnceobj =ConnectPool.get_instance()print(obj)#<__main__.ConnectPool object at 0x000002523F0174E0>obj1 =ConnectPool.get_instance()print(obj1)#<__main__.ConnectPool object at 0x000002523F0174E0>print(obj1==obj)#True

   

 

转载于:https://www.cnblogs.com/sfencs-hcy/p/9689925.html

你可能感兴趣的文章
mybatis学习
查看>>
LCD的接口类型详解
查看>>
Spring Boot Unregistering JMX-exposed beans on shutdown
查看>>
poi 导入导出的api说明(大全)
查看>>
Mono for Android 优势与劣势
查看>>
将图片转成base64字符串并在JSP页面显示的Java代码
查看>>
js 面试题
查看>>
sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
查看>>
腾讯云下安装 nodejs + 实现 Nginx 反向代理
查看>>
Javascript 中的 Array 操作
查看>>
java中包容易出现的错误及权限问题
查看>>
AngularJS之初级Route【一】(六)
查看>>
服务器硬件问题整理的一点总结
查看>>
SAP S/4HANA Cloud: Revolutionizing the Next Generation of Cloud ERP
查看>>
Mellanox公司计划利用系统芯片提升存储产品速度
查看>>
白帽子守护网络安全,高薪酬成大学生就业首选!
查看>>
ARM想将芯片装进人类大脑 降低能耗是一大挑战
查看>>
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>