首页 > 其他分享 >14面向对象

14面向对象

时间:2023-04-14 10:33:17浏览次数:39  
标签:__ 14 heigth self 面向对象 print width def

面向对象

面向对象编程介绍

面向对象编程:Object Oriented Programming,简称OOP,是一种程序设计思想。
需要注意的是,与之对应的是面向过程编程思想。实际上,能够使用面向对象编程思想实现的程序,也都能通过面向过程完成。只是看哪种思想更适合当前开发需求。

面向过程与面向对象区别

面向过程:根据业务逻辑从上到下写代码  
面向对象:将数据与函数绑定到一起,进行封装。减少重复代码的重写过程

类和对象

  • 类:具有同一特征的事物,是抽象的,不是真实存在的。用来描述具有相同属性和方法的对象的集合。
  • 对象:某一个具体事物的存在,在现实世界中可以是看得见摸得着的。

注意:开发中,先有类,再有对象。

类的构成

类由3个部分构成

  • 类的名称:类名
  • 类的属性:一组数据
  • 类的方法:允许对类进行操作的方法

注意:类名通常采用驼峰式命名方式,尽量让字面意思体现出类的作用。

# 类的定义
class 类名称:
    类的属性(成员变量)
    
    类的行为(成员方法)

创建对象

python中,可以根据已经定义的类去创建出一个个对象
创建对象的格式为:

# 创建类对象的语法
对象 = 类名称()

类与对象的使用

# 定义
class 类名:
    def 方法名(self,参数):  # 类中函数:称为方法
        pass
        
# 执行
s = 类名()         # 创建对象(实例) 这个过程就是实例化
s.方法名(参数)     # 调用类中方法

self参数

在类当中定义方法时,会发现系统帮我们自动创建了self参数,并且在调用对象的该方法时,也无需传入self参数。

self的两个概念:

  • self本身是形参
  • self就是当前对象本身
class Student:
    def printinfo(self):
        print(lisi.name, lisi.age)
        print(self.name, self.age)   # 这里会高亮,对象的属性是暴露在外面的
        print(lisi)
        print(self)

lisi = Student()  # 对象
# 对象的属性是暴露在外面的
lisi.name = '李四'
lisi.age = 38

lisi.printinfo()
"""
李四 38
李四 38
<__main__.Student object at 0x000002E5A099B208>
<__main__.Student object at 0x000002E5A099B208>

说明在类中printinfo()方法中,lisi和self是等价的
"""

魔法方法

在Python的类中,以两个下划线开头、两个下划线结尾的方法,如常见的 :__init__()、__str__()、__del__()等,就被称为「魔术方法」(Magic methods)。之所以会叫魔法方法原因是这些方法都是到达某个条件自动触发,无需调用,如果希望根据自己的程序定制特殊功能的类,那么就需要对这些方法进行重写。使用这些「魔法方法」,我们可以非常方便地给类添加特殊的功能。

__init__()

_init_() :初始化对象

class My_Phone():
    def __init__(self):
        self.width = 10
        self.heigth = 15

    def main(self):
        print(self.width)
        print(self.heigth)

apple = My_Phone()

_init_() ⽅法,在创建⼀个对象时默认被调⽤,不需要⼿动调⽤
_init_(self) 中的self参数,不需要开发者传递,python解释器会⾃动把当前的对象引⽤传递过去。

  • 带参数的init

⼀个类可以创建多个对象,对不同的对象设置不同的初始化属性,传参即可。

class My_Phone():
    def __init__(self,width,heigth):
        self.width = width
        self.heigth = heigth

    def apple_phont(self):
        print("苹果手机的宽为:",self.width)
        print("苹果手机的高为:",self.heigth)

    def huawei_phont(self):
        print("华为手机的宽为:",self.width)
        print("华为手机的高为:",self.heigth)

apple = My_Phone(10,20)
apple.apple_phont()

_str_()

当使⽤print输出对象的时候,默认打印对象的内存地址。如果类定义了 str ⽅法,那么就会打印在这个⽅法中 return 的数据。
_str_():解释类的属性或作用

class Demo():
    def __init__(self, width, heigth):
        self.width = width
        self.heigth = heigth

    def __str__(self):
        return f"你这个手机的宽是{self.width},高度是{self.heigth}"

a = Demo(10,20)
print(a)  # 你这个手机的宽是10,高度是20
# 若没有__str__()方法,则会打印对象的内存地址:<__main__.Demo object at 0x000001E6FC7A7198>

_del_()

当删除对象时,python解释器也会默认调⽤ __del__() ⽅法。在对象销毁的时候被调用,当对象不再被使用时,del()方法运行:

class Demo():
    def __init__(self, width, heigth):
        self.width = width
        self.heigth = heigth

    def __del__(self):
        print("对象已经删除")

a = Demo(10,20)

# __del__方法
class Demo:
    def __del__(self):  # 当由该类创建的实例对象,被删除或者说在内存中被释放,将会自动触发执行。
        print("被释放了!")


d = Demo()
print("*" * 20)
# del d  # 相当于提前执行了del方法
print("*" * 20)

类属性与方法

类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问

class Demo():
    __num = 0  # 私有属性
    result = 0  # 公开属性

    def count(self):
        self.__num += 1
        self.result += 1
        print(self.__num)

    def getnum(self):
        return self.__num

run = Demo()
run.count()
print(run.result)
# print(run.__num)    # 报错,实例不能访问私有变量
__num = run.getnum()
print(__num)

类的私有方法

class func:
    def fun1(self):
        print("1")

    def __fun2(self):
        print("2")

    def fun3(self):
        return (self.__fun2())

f = func()

f.fun1()
# f.__fun2()
f.fun3()

# 强行调用类的私有方法
# 对象._类名__私有属性
print(f._func__fun2)  # 不建议使用

python中没有真正意义上的私有

实例属性

# 实例属性
class Province:
    def __init__(self, country, province):
        self.country = country
        self.province = province

    def print_info(self):
        print(self.country, self.province)  # 通过self去访问  这个要方便很多
        print(zs.country, zs.province)   # 通过每个对象去访问


zs = Province("中国", "湖南")
zs.print_info()

ls = Province("中国", "湖北")
ls.print_info()

实例方法

class Demo:
    def __init__(self):
        self.name = "张三"

    # 实例方法  
    def fun1(self):
        print(self.name)

a = Demo()
a.fun1()

标签:__,14,heigth,self,面向对象,print,width,def
From: https://www.cnblogs.com/daguo118/p/17317557.html

相关文章

  • Linux中使用ntpdate同步失败报错:14 Apr 08:42:12 ntpdate[1255]: the NTP socket is i
    报错信息: 报错原因:1、可能是因为同步的域名信息没有解析到。2、可能是因为服务的问题导致没有同步成功。 解决方法:1、先关闭ntpd服务。[root@k8s-master01~]#servicentpdstopRedirectingto/bin/systemctlstopntpd.service 2、重新同步。[root@k8s-maste......
  • python面向对象(继承)
    一继承1、什么是继承1)继承是一种创建新类的方式,新建的类可称为子类或派生类,父类又可称为基类或超类子类会遗传父类的属性2)需要注意的是:python支持多继承在python中,新建的类可以继承一个或多个父类classParent1:passclassParent2:passclassSub1(Paren......
  • 4月14号总结
    packagehhh;importjava.io.IOException;importjava.io.PrintWriter;importjava.util.ArrayList;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.annotation.WebServlet......
  • HDU 5145 NPY and girls (莫队分块离线)
    题目地址:HDU5145莫队真的好神奇。。这样的复杂度居然只有n*sqrt(n)。。。裸的莫队分块,先离线,然后按左端点分块,按块数作为第一关键字排序,然后按r值作为第二关键字进行排序。都是从小到大,可以证明这样的复杂度只有n*sqrt(n)。然后进行块之间的转移。代码如下:#include<ios......
  • HDU 1452 Happy 2004 (积性函数)
    题目地址:HDU1452性质1:如果gcd(a,b)=1则S(a*b)=S(a)*S(b)2004^X=4^X*3^X*167^XS(2004^X)=S(2^(2X))*S(3^X)*S(167^X)性质2:如果p是素数则S(p^X)=1+p+p^2+…+p^X=(p^(X+1)-1)/(p-1)因此:S(2004^X)=(2^(2X+1)-1)*(3^(X+1)-1)/2*(167^(X+1)-1)/166......
  • Educational Codeforces Round 146 (Rated for Div. 2)
    Preface补题ing值得一提的时补这场的时候先是遇上了CF的12小时大维护,后面又遇到了评测机崩了测不了也是有点有意思的说A.Coins傻逼题,首先考虑\(2|n\)时一定有解\(x=\frac{n}{2},y=0\),否则若\(2\nmidn\and2|k\)则由裴蜀定理知此时一定无解否则\(y\)必为奇数,我们令\(x=\fra......
  • 遗传算法 无功优化matlab 利用遗传算法和改进遗传算法对标准节点系统(14 33节点)进行无
    遗传算法无功优化matlab利用遗传算法和改进遗传算法对标准节点系统(1433节点)进行无功优化,以网损+电压偏差罚函数+无功偏差罚函数作为目标函数,利用发电机端电压变压器变比电容器容量作为优化变量,实现很好的优化效果ID:8790635531309941......
  • CF1473D 题解
    题目传送门题目分析线段树、前缀和、\(\text{ST}\)表题解都有了,我补一发猫树题解吧。由于每次操作只能将大小改变成跟原来差\(1\),所以只需要知道这段操作中的最大值和最小值,最后所求的答案的范围就被卡住了。对于每一次操作,我们把操作序列拦腰斩断,那么分别求两边的范围,最后减......
  • 跟着查老四学Python Day 8:面向对象编程
    面向对象编程基本概念日常寒暄之后,查老四开始讲课了查老四:好的,我会尽量满足你的要求。现在我们开始第一节:面向对象编程。面向对象编程(Object-OrientedProgramming,简称OOP)是一种编程范式,它提倡将现实世界中的事物抽象为程序中的类(Class)和对象(Object),通过封装(Encapsulation)、继承(Inhe......
  • 面向对象编程 -- 创建对象1
    面向对象编程 --创建对象1//虽然使用Object构造函数或对象字面量可以方便地创建对象,但这些方式也有明显不足:创建具有同样接口的多个对象需要编写很多代码。一、概述//纵观ECMAScript规范的历次发布,每个版本的特性似乎都出人意料。//ECMAScript6开始正式支持类和继......