python面对对象编程

基本概念

class类

一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法

Object 对象 
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同

Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法

Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承

Polymorphism 多态

一个接口,多种实现

类的创建

class Car(object):

    def __init__(self,type,price):
        self.type = type
        self.price = price

    def carinfo(self):
        print("type:%s,price:%d"%(self.type,self.price))

tesla = Car(‘tesla‘,2000)
jeep = Car(‘jeep‘,1000)

tesla.carinfo()
jeep.carinfo()

对象之间的交互

class Garen:
    camp = ‘Demacia‘

    def __init__(self,name,aggressivity = 58,life_value = 455): #初始攻击力和生命值
        self.name = name
        self.aggressivity = aggressivity
        self.life_value = life_value

    def attack(self,enemy):   #普通攻击技能,攻击敌人
        enemy.life_value -= self.aggressivity    #根据攻击力,减掉敌人生命值

class Riven:
    camp = ‘Noxus‘

    def __init__(self,name,aggressivity = 54,life_value = 4514):
        self.name = name
        self.aggressivity = aggressivity
        self.life_value = life_value

    def attack(self,enemy):
        enemy.life_value -= self.aggressivity

g1 = Garen(‘盖伦‘)
r1 = Riven("瑞文")

print(g1.life_value)
r1.attack(g1)     #交互
print(g1.life_value)

继承

继承指的是类与类之间的关系,是一种什么是什么的关系,功能之一就是用来解决代码重用问题

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

class People(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def eat(self):
        print("%s is eating..." % self.name)
    def talk(self):
        print("%s is talking..." % self.name)
    def sleep(self):
        print("%s is sleeping..." % self.name)

class Man(People):
    def __init__(self,name,age,money):
        super(Man,self).__init__(name,age)
        self.money  = money
        print("%s 一出生就有%s money" %(self.name,self.money))
    def sleep(self):
        print("man is sleeping ")

class Woman(People):
    def get_birth(self):
        print("%s is born a baby...." % self.name)

m1 = Man("jack",22,10000)
m1.sleep()
w1 = Woman("alex",26)
w1.get_birth()

组合

组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同

1.继承的方式

通过继承建立了派生类与基类之间的关系,它是一种‘是‘的关系,比如白马是马,人是动物。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人

2.组合的方式

用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...

class Equip():
    def file(self):
        print(‘release fire skill‘)

class Riven():
    camp = ‘Noxus‘
    def __init__(self,name):
        self.name = name
        self.equip = Equip()   #用Equip类产生一个装备,赋值给实例的equip属性

r1 = Riven(‘瑞文‘)
r1.equip.file()    #可以使用组合的类产生的对象所持有的方法

结果:
release fire skill

继承与组合例子:

class People(object):
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

class Course(object):
    def __init__(self,name,period,price):
        self.name = name
        self.period = period
        self.price = price
    def tell_info(self):
        print(‘%s %s %s‘%(self.name,self.period,self.price))

class Teacher(People):
    def __init__(self,name,age,sex,job):
        super(Teacher, self).__init__(name,age,sex)
        self.job = job
        self.course = []
        self.students = []

class Student(People):
    def __init__(self,name,age,sex):
        super(Student, self).__init__(name,age,sex)
        self.course = []

#老师和学生对象
jack = Teacher(‘jack‘,18,‘male‘,‘c++‘)
s1 = Student(‘derek‘,12,‘female‘)
#课程
python = Course(‘python‘,‘3mons‘,3000)
linux = Course(‘linux‘,‘4mons‘,5000)
#为老师和学生添加课程
jack.course.append(python)
jack.course.append(linux)
s1.course.append(linux)
#为老师添加学生
jack.students.append(s1)
#使用
for obj in jack.course:
    obj.tell_info()

3.私有属性

方法

1.静态方法(@staticmethod)

静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了

class Dog(object):

    def __init__(self,name):
        self.name = name
    @staticmethod
    def eat():
        print(‘is eating‘)

d = Dog(‘xiaohei‘)
d.eat()

2.类方法(@classmethod)

class Dog(object):

    def __init__(self,name):
        self.name = name
    @classmethod
    def eat(cls):
        print(‘is eating‘)

d = Dog(‘xiaohei‘)
d.eat()

3.属性方法(@property)

class Dog(object):

    def __init__(self,name):
        self.name = name
    @property
    def eat(self):
        print(‘is eating‘)

d = Dog(‘xiaohei‘)
d.eat

把一个方法变成一个静态属性,因为eat此时已经变成一个静态属性了, 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了

多态

所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态

class F1(object):
    def show(self):
        print ‘F1.show‘

class S1(F1):

    def show(self):
        print ‘S1.show‘

class S2(F1):

    def show(self):
        print ‘S2.show‘

def Func(obj):
    print obj.show()

s1_obj = S1()
Func(s1_obj)   # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show

s2_obj = S2()
Func(s2_obj)   # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show

类的特殊方法

表示类的描述信息

1.__doc__

class Func():
    """ 这里显示的是描述信息 """

    def func(self):
        pass
print(Func.__doc__)

结果:
这里显示的是描述信息

2.__str__

如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Foo:
    def __str__(self):
        return ‘alex li‘
obj = Foo()
print(obj)
7
结果:
alex li

3.反射

hasattr:判断一个对象是否有对应字符串方法

getattr:获取方法

setattr:添加方法

delattr:删除方法

def bulk(self):   #添加的方法
    print("%s is yelling...." %self.name)

class Dog(object):
    def __init__(self,name):
        self.name = name

    def eat(self,food):
        print("%s is eating..."%self.name,food)

d = Dog("NiuHanYang")
choice = input(">>:").strip()

if hasattr(d,choice):    #输入的字符串,判断是否有对应字符串的方法
    func1 = getattr(d,choice)
    func1(‘‘)
else:
    setattr(d,choice,bulk) #d.talk = bulk   #通过setattr在类外部添加方法
    func2 = getattr(d, choice)
    func2(d)

# if hasattr(d.choice):   #删除
#     delattr(d.choice)

4.__del__

创建对象后,python解释器默认调用__init__()方法;

当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法

原文地址:https://www.cnblogs.com/xuyxbiubiu/p/10402632.html

时间: 2024-07-29 22:37:25

python面对对象编程的相关文章

Python 面对对象编程

面向对象编程: 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处. 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对

python面对对象编程-------5:获取属性

一:最基本的属性操作 1 class Generic: 2 pass 3 4 g= Generic() 5 6 >>> g.attribute= "value" #创建属性并赋值 7 >>> g.attribute 8 'value' 9 >>> g.unset 10 Traceback (most recent call last): 11 File "<stdin>", line 1, in &l

python接口自动化九--面对对象编程二,搭建测试环境,多线程与多进程

1.面对对象编程 1.1 基本概念 实例方法:在类里面定义的函数都是实例方法,函数内有self变量 类方法: 不可以实例化,直接用类名调用 类方法可以使用类变量,cls.xxx 实例可以通过self.xx使用类方法 类方法里面不能使用实例方法和实例变量 静态方法: 定义在类里的普通函数 用不了实例方法,实例变量,类方法,类变量 不需要实例化,直接用类名调用 ? 属性方法: 是实例方法 不能有入参 用它的时候,直接m.func,把它当做变量来使用,后面不需要加括号 它是获取函数的返回值 析构函数:

Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2.异常种类 3.异常其他结构 4.主动触发异常 5.自定义异常 6.断言 四.反射 五. 单例模式 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass ob

Python - 面对对象(基础)

目录 Python - 面对对象(基础) 一. 概述 二. 创建类和对象 三. 面向对象三大特征 封装 继承 多态 Python - 面对对象(基础) 一. 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面向过程编程(Object Oriented Programming,OOP,面向对象程序设计) 最易被初学者接受,其往往用一长段代码来实现指定功能,开发

16、python面对对象之类和继承

前言:本文主要介绍python面对对象中的类和继承,包括类方法.静态方法.只读属性.继承等. 一.类方法 1.类方法定义 使用装饰器@classmethod装饰,且第一个参数必须是当前类对象,该参数名一般约定为“cls",通过它来传递类的属性和方法 (不能传递实例属性和实例方法),跟实例方法的self用法相似. 2.类方法的调用 实例对象和类对象都可以调用 3.应用场景 在需要站在类的角度执行某个行为时,那么就可以定义为类方法 class Student: def __init__(self,

跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

面对对象常用的一些关键子:http://www.cnblogs.com/xishaonian/p/6146794.html排版不是很好望见谅. THE END 跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

跟着百度学PHP[4]OOP面对对象编程-5-内部引用$this

$this就是对象内部代表这个对象的引用 可以调用被封装的方法或者属性! <?php class Person{ private $name; private $age="21"; var $sex; function play(){ echo "他正在玩儿呢"; } private function Hello(){ //使用private封装hello方法.该方法不可直接调用.但是可以在内部使用$this调用. echo "这个是被封装的内容&q

js面对对象编程

说到js,很大一部分人会说我很熟悉,在日常的web开发中经常用,那么你的js代码是符合面对对象思路的吗?那你会问我面向过程的js代码有什么不好吗?我的感受是面对对象的js编码更加简洁,减少了混乱,可维护行增强,适合编写富客户端时应用. 好了,首先看看js里如何定义对象: <html> <head> <script type="text/javascript"> var obj=new Object(); obj.name='josh'; obj.ag