7.面向对象编程高级

什么是类和对象

class Garen:
    camp=‘Demacia‘
    def __init__(self,nickname,aggresivity,life_value):
        self.nickname=nickname
        self.aggresivity=aggresivity
        self.life_value=life_value

    def attack(self,enemy):
        print(‘is attacting‘)

#类的第一个功能:实例化
g1=Garen(‘草丛伦‘,82,100)
#类的的第二个功能:属性引用,包含数据属性和函数属性
g1.attack(2222)
#对于一个实例来说,只有一个功能:属性引用,实例本身只拥有数据属性
print(g1.nickname)
print(g1.aggresivity)
print(g1.life_value)

接口与归一化设计

#接口的概念,父类只写名字,不写实现
class ALLFile:  #接口类
    def read(self): #接口函数
        pass
    def write(self):
        pass
class Text(ALLFile):    #子类继承父类
    def read(self):
        print(‘text read‘)
    def write(self):
        print(‘text write‘)
class Sata(ALLFile):    #子类继承父类
    def read(self):
        print(‘sata read‘)
    def write(self):
        print(‘sata write‘)
t=Text()
s=Sata()
t.read()
t.write()
s.read()
s.write()

抽象类

import abc
class ALLFile(metaclass=abc.ABCMeta):  #抽象类
    @abc.abstractmethod      #加这个装饰器的必须在子类中实现
    def read(self): #
        pass
    @abc.abstractmethod     #加这个装饰器的必须在子类中实现
    def write(self):
        pass
    def test(self):#可以不被实现
        print(‘22222222‘)
class Text(ALLFile):    #子类中必须实现父类中规定的两个方法
    def read(self):pass
    def write(self):pass
t1=Text()
t1.test()
# 抽象类不能被实例化,
# a=ALLFile()

反射

class Foo:
    def __init__(self,name):
        self.name=name
    def func(self):
        print(‘func‘)

f = Foo(‘egon‘)
print(Foo.__dict__)
print(f.__dict__)
#hasattr判断类中是否有这个func的名字
print(hasattr(Foo,‘func‘))

#判断实例中是否有x这个属性
print(hasattr(f,‘x‘))
f.x=1
#根据字符串,调用实例中的属性
print(getattr(f,‘x‘))
#常用组合
if hasattr(f,‘func‘):
    getattr(f,‘func‘)()
#调用,如果没有,返回None
print(getattr(f,‘y‘,None))
#设置一个属性
#f.y=1
setattr(f,‘y‘,1)

属性方法:

class A:
    def __init__(self,name):
        self.__name=name
    @property   #将这个类中的方法,变成一个类中的属性,可以通过.name调用
    def name(self):
        return self.__name      #当调用.name时返回的是__self.name
    @name.setter    #赋值操作调用,当为.name赋值时调用
    def name(self,value):
       # print(‘------‘)
        if not isinstance(value,str):   #判断赋值的是不是字符
           raise TypeError(‘%s must be str‘%value)#抛出异常
        self.__name=value
    @name.deleter   #删除.name属性时调用
    def name(self):
        print(‘=====‘)
        del self.__name
a=A(‘ennn‘)
print(a.name)
a.name=‘ssa‘
print(a.name)
del a.name

继承

class A:    #默认继承object
    pass
class B(A):#继承A
    pass
#打印继承的父类
print(B.__bases__)  #继承了
print(A.__bases__)  #

#新式的类
class Animal:

    start=‘earth‘
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender
    def run(self):
        print(‘running‘)
    def talk(self):
        print(‘talking‘)
class People(Animal):
    pass
    def piao(self):
        print(‘大保健‘)
class Pig(Animal):
    pass

p1=People(‘alex‘,50,‘F‘)
pig1=Pig(‘贺磊‘,250,‘22‘)
print(p1.start)
p1.run()
#继承可以重用代码
class Hero:
    def __init__(self,nickname,aggresivity,life_value):
        self.nickname=nickname
        self.aggresivity=aggresivity
        self.life_value=life_value

    def attack(self,enemy):
        print(‘is attacting‘,enemy.nickname)
        enemy.life_value-=self.aggresivity
class Garen(Hero):
    camp=‘Demacia‘

class Riven(Hero):
    camp=‘Noxus‘

子类继承父类的方法:super()

class People(object):
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
class Teacher(People):
    def __init__(self,name,age,sex,level):
        #People.__init__(name,age,sex)  #需要知道父类的名字~
        super().__init__(name,age,sex)  #推荐用法
        self.level=level
t1=Teacher(‘alex‘,22,‘m‘,‘高级‘)
print(t1.name)

静态方法

@staticmethod静态方法不属于实例,也不属于类与类只是名义上的归属关系
@classmethod类方法只能访问类变量,不能访问实例变量
import time
class Date:
    def __init__(self,year,month,day):
        self.year=year
        self.month=month
        self.day=day
    @staticmethod   #静态方法
    def now():
        t=time.localtime()
        return Date(t.tm_year,t.tm_mon,t.tm_mday)
    ‘‘‘打印:
            <__main__.Date object at 0x0000022298A754A8>‘‘‘
    @classmethod #改成类方法
    def class_now(cls):
        t=time.localtime()
        return cls(t.tm_year,t.tm_mon,t.tm_mday) #哪个类来调用,即用哪个类cls来实例化
    ‘‘‘
    输出结果:
    year:2017 month:3 day:3
    ‘‘‘
class EuroDate(Date):
    def __str__(self):
        return ‘year:%s month:%s day:%s‘ %(self.year,self.month,self.day)

e=EuroDate.now()
print(e) #我们的意图是想触发EuroDate.__str__,此时e就是由EuroDate产生的,所以会如我们所愿
print(EuroDate.class_now())
print(Date.now())

面向对象高级使用

class Foo:
    def __init__(self,name):
        self.name=name

    def __getitem__(self, item):
        print(self.__dict__[item])

    def __setitem__(self, key, value):
        self.__dict__[key]=value
    def __delitem__(self, key):
        print(‘del obj[key]时,我执行‘)
        self.__dict__.pop(key)
    def __delattr__(self, item):
        print(‘del obj.key时,我执行‘)
        self.__dict__.pop(item)
f=Foo(‘egon‘)
print(f[‘name‘])
f[‘x‘]=1
print(f.__dict__)
del f.x
#del f[‘x‘]
时间: 2024-11-08 23:53:00

7.面向对象编程高级的相关文章

js面向对象编程-高级内容

JavaScript面向对象 一.为每个对象动态添加属性或方法 功能:返回对象类型原型的引用 prototype的使用 格式:class.prototype 场景: 比如说:A写了一个类,交给B,B在使用时发现A写的类的功能有所欠缺,但是B没有权力改写A的文件,这时该怎么办? Function Person(name1,age1){ This.name=name1; This.age=age1; } Var p1=new Person(‘zhangsan’,30); p1.sex=’男’ B认为

Python面向对象编程高级特性

***这里还是根据网上资料,主要是廖雪峰老师的教程学习的笔记,主要介绍python面向对象的高级特性,笔记不全,只是记录自己觉得容易出错的地方*** 1.python作为一种动态语言,他的动态绑定机制允许在运行过程中动态的给class或者对象实例添加方法和属性,这个在静态语言中比如java是很难做到的: 1)动态绑定属性: 2)动态绑定方法 给一个实例绑定的方法对于其他实例和类都是不可见的:(这里也说明给一个实例动态绑定方法必须用MethodType(func, instance)) 但是给类绑

8. Scala面向对象编程(高级部分)

8.1 静态属性和静态方法 8.1.1 静态属性-提出问题 有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何知道现在共有多少人在玩?请使用面向对象的思想,编写程序解决 8.1.2 基本介绍 -Scala中静态的概念-伴生对象 Scala语言是完全面向对象(万物皆对象)的语言,所以并没有静态的操作(即在Scala中没有静态的概念).但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象来模拟类对象,我们称之为类的伴生对象.这个类的所有静态内容都可以放置在它的伴生对象中

PHP面向对象初中高级之由浅入深

php面向对象编程基本实践:(了解类,类到对象的实例化,构造和析构,对象的引用); 类的概念: 物以类聚,把具有相似特性的对象对垒到一个类中 类定义了这些相似对象拥有的相同的属性和方法 类是相似对象的描述,成为类的定义,是该类对象的蓝图或者原型 类的对象称为一个类的实例. 类的属性和方法统称为类成员 实例化的概念.类的定义和调用 类的实例化就是通过类的定义创建一个对象 类的定义以关键字class开始,后面跟着这个类的名称.类的命名通常每个单词的第一个字母大写,以大括号开始和结束 类的实例化为对象

进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 要在类中使用静态方法,需在类成员函数前面加上@staticmethod标记符,以表示下面的成员函数是静态函数.使用静态方法的好处是,不需要定义实例即可使用这个方法.另外,多个实例共享此静态方法. 类方法 类方法与普通的成员函数和静态函数有不同之处,在接触的语言中好像也没见过这种语义,看它的定义: 

进击的Python【第六章】:Python的高级应用(三)面向对象编程

Python的高级应用(三)面向对象编程 本章学习要点: 面向对象编程介绍 面向对象与面向过程编程的区别 为什么要用面向对象编程思想 面向对象的相关概念 一.面向对象编程介绍 面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法.对象指的是类的实例. 已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用. 此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它

Python自动化开发课堂笔记【Day08】 - Python进阶(面向对象的高级用法,网络编程)

面向对象的高级用法 1. __str__ 只要执行打印对象的操作,就会触发该对象类中的__str__方法(也就是对象的绑定方法)它是一种默认的方法,默认的打印输出为<__main__.Foo object at 0x003EE350>,但是如果将该绑定方法在类中重写的话,要求必须有以字符串类型的返回值,返回形式可以自己设定. class Foo: def __init__(self,name,age): self.name = name self.age = age def __str__(s

十三、Python高级功能之面向对象编程

Python高级功能之面向对象编程(类和对象) 一.类和对象: 面向过程和面向对象的编程 面向过程的编程:函数式编程,C程序等 面向对象的编程:C++,Java,Python等 类和对象:是面向对象中的两个重要概念 类:是对事物的抽象,比如:汽车模型 对象:是类的一个实例,比如:QQ轿车.大客车 范例说明: 汽车模型可以对汽车的特征和行为进行抽象,然后可以实例话为一台真实的汽车实体出来 二.Python类定义 Python类的定义: 使用class关键字定义一个类,并且类名的首字母要大写: 当程

Python基础-第七天-面向对象编程进阶和Socket编程简介

本篇内容: 1.面向对象编程进阶-静态方法 2.面向对象编程进阶-类方法 3.面向对象编程进阶-属性方法 4.面向对象编程进阶-特殊成员(内置方法) 5.面向对象编程进阶-反射 6.异常处理.断言 7.Socket编程简介 一.面向对象编程进阶-静态方法 1.静态方法的实现 通过@staticmethod装饰器可以把其装饰的方法变为一个静态方法: 变成静态方法后,形参中可以不用写self了.如果写了self,默认是不会把对象本身传递给self,需要手动传递: class Dog(object):