面向对象(视频)

一、基本的例子

'''
概念:类、对象、
封装(防止数据被随意修改,外部调用变得简单)、
继承(共同点在父类,不同点在子类)、
多态(子类重写父类方法,对不同类的对象发出相同的消息将会有不同的行为)
'''
class Dog:
    nation = "JAPAN"
    def __init__(self, name):  # 构造函数
        self.name = name
    def sayhi(self):   # 类的方法
        print(self.name + ": " + "hello,i'm a dog..")
    def __del__(self):
        print("析构方法,删除对象的引用后执行。例如:del(对象)或者程序执行结束",注意引用计数为0时才执行此方法)
d1 = Dog("Dog1")
d2 = Dog("Dog2")
d1.sayhi()  # Dog1: hello,i'm a dog..
d2.sayhi()  # Dog2: hello,i'm a dog..
print(d1.nation, d2.nation)  # JAPAN JAPAN
Dog.nation = "JP"  # 通过类修改共有属性
print(d1.nation, d2.nation)  # JP JP
d1.nation = "CN"  # 只修改某对象的共有属性
print(d1.nation, d2.nation)  # CN JP
Dog.nation = "MO"  # 再通过类修改共有属性
print(d1.nation, d2.nation)  # CN MO
面向对象代码的例子
'''
最基本的类就写完了,
self是实例本身:
d = Dog("Dog1") <==>  d = Dog(d, "Dog1")
1、成员属性self.name=name
2、方法def sayhi这个方法也是共有的类的所有成员都用这个方法,
    要用私有方法只能:
    def sayhi2(self):
        print("my sayhi")
    d1.sayhi = sayhi2
    d1.sayhi(d1)
3、私有属性self.__name=name
    内部可以访问,外部不能访问,
    如果想外部只读取,可以定义def get__name(self):return self.__name
4、共有属性,在类里定义的变量nation。对象d.nation先找成员属性nation再找
    共有属性nation。如果没有成员属性nation就取类的nation,
    如果d.nation = 1这样就创建了类本身的成员属性nation,
    跟共有属性nation没有关系。
5、类里的方法和共有属性只有一份。类的所有对象共用类里的方法,这样是为什么
   类的方法必须要有self关键字,这样类的方法才知道是谁在调用
6、__del__(self)是类的析构方法。作用是清除对象的引用(当引用被清除那内存空间很快
   也将被垃圾回收机制清除),引用为0时会运行,在程序结束后会运行,运行中可以手动del(对象)
'''

二、继承的例子

'''
继承可以通过“继承”或“组合”实现
多重继承,多级继承
'''
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def talk(self):
        print("person is talking..")
class BlackPerson(Person):
    def __init__(self, name, age, strength):
        super().__init__(name, age)  # <==> Person.__init__(name, age)
        self.strength = strength
    def talk(self):
        print("Black Person talking..")
class WritePerson(Person):
    pass

b = BlackPerson("Smith", 30, "Strong")
b.talk()
继承的例子(一)

 

class SchoolMember:
    '''
    学校成员类
    '''
    member = 0
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
    def enroll(self):
        print("注册了一个新成员:", self.name)
        SchoolMember.member += 1
    def tell(self):
        print("打印个人信息:",self.name)
        for k in self.__dict__:
            print(k,self.__dict__[k])
        print("---------end------------")
    def __del__(self):
        print("开除了:",self.name)
        SchoolMember.member -= 1
class Teacher(SchoolMember):
    def __init__(self, name, age, sex, salary, course):
        super().__init__(name, age, sex)
        self.salary = salary
        self.course = course
        self.enroll()
    def teaching(self):
        print("teaching 课程:", self.course)
class Student(SchoolMember):
    def __init__(self, name, age, sex, course, tuition):
        super().__init__(name, age, sex)
        self.course = course
        self.tuition = tuition
        self.amount = 0
        self.enroll()
    def pay_tution(self, amount):
        print(self.name, amount)
        self.amount += amount
t1 = Teacher("Wusir", 28, "M", 8000, "Python")
s1 = Student("HaiTao", 20, "F", "python", 12000)
s1 = Student("Jack", 20, "F", "python", 12000)
# print(SchoolMember.member)
# del(s1)
s1.tell()
继承的例子(二)

 

三、新式类经典类一丝丝区别(不重要)

################################################################################
了解,不重要:
Python2中,继承的层级。经典类是深度查询,新式类是广度查询
python3中,继承的层级。都是广度查询
###############################################################################

四、Python模拟多态

'''
多态:接口重用
Python模拟多态
'''
class Animal:
    def __init__(self, name):
        self.name = name
    def talk(self):
        raise NotImplementedError("子类必须重构talk方法")
    @staticmethod
    def all_talk(obj):
        obj.talk()
class Cat(Animal):
    def talk(self):
        print("Miao..Miao..")
class Dog(Animal):
    def talk(self):
        print("Wang..Wang..")
d = Dog("dog1")
c = Cat("cat1")

Animal.all_talk(d)
Animal.all_talk(c)
模拟多态

 

五、类的属性有哪些

##############################################################################
'''
属性:
    成员属性
    公有属性(类属性)
    私有属性
方法:
    公有方法
    私有方法
    静态方法@staticmethod
    类方法@classmethod
属性方法(特性)@property
''' ###############################################################################

 

六、静态方法例子

'''
静态方法@staticmethod
静态方法相当于单纯的函数,没有self关键字
类方法@classmethod
类方法只能访问公有属性。之前每个对象修改的公有属性是自己的,
通过类修改公有属性才改的大家的。
变为类方法后任何对象都可以修改公有属性。
'''
class Person:
    nation = "朝鲜"
    def __init__(self, name):
        self.name = name
    @classmethod
    def change_nation(self):
        self.nation = "中国"
p = Person("金三胖")
p1 = Person("朴xx")
p.change_nation()
print(p.nation, p1.nation)   #中国 中国
print(Person.nation)  #中国
静态方法例子

 

七、属性方法(或者叫做特性)

class Dog:
    def __init__(self):
        self.__food = None
    @property
    def eat(self):
        print("eat:", self.__food)
    @eat.setter
    def eat(self, food):
        self.__food = food
    @eat.deleter
    def eat(self):
        del self.__food

d = Dog()
d.eat
d.eat = "骨头"
d.eat
del d.eat
d.eat

############
# eat: None
# eat: 骨头
# AttributeError: 'Dog' object has no attribute '_Dog__food'
############
属性方法简单例子
'''
属性方法的应用实例:
用户查航班状态,
1、需要调航空公司接口
2、解析数据
3、返回给用户结果
'''
class Flight:
    def __init__(self, name):
        self.name = name
    @property
    def flight_status(self):
        api = 1
        if api == 0:
            print("航班延迟")
        elif api == 1:
            print("航班到达")
        elif api == 2:
            print("航班飞走")
        else:
            print("无法确认")
f = Flight("CA980")
f.flight_status
属性方法例子

 

八、理解概念“类也是一个对象”

'''
__doc__:打印类的注释信息
__module__:返回对象的模块
__class__:输出类名
__init__:
__del__:
__call__:让对象可以加括号运行
__dict__:查看类(打印类里的所有属性不包括实例属性)或对象(打印实例属性不包括类属性)中的所有成员
__str__:打印对象的字符串形式
__getitem__:用户自己封装一个字典,用字典的形式使用对象,obj["name"]
__setitem__:用户自己封装一个字典,用字典的形式使用对象,obj["name"]="alex"
__delitem__:用户自己封装一个字典,用字典的形式使用对象,del obj["name"]
__metaclass__:定义自己的类被哪个原类创建
'''
'''
类也是一个对象。类的类是type
'''
def func(self):
    print("hello world", self.name, self.age)
def __init__(self, name, age):
    self.name = name
    self.age = age
Foo = type("Foo", (), {"talk":func, "__init__":__init__}) # 类定义(用type实例化类)
f = Foo("BB", 23)  # 实例化对象
f.talk()   # 打印hello world

九、Python2中类怎么被创建的

class MyType(type):
    def __init__(self, what, bases=None, dict=None):
        print("---MyType init---")
        super(MyType, self).__init__(what, bases, dict)
    def __call__(self, *args, **kwargs):
        print("---MyType call---")
        obj = self.__new__(self, *args, **kwargs)
        self.__init__(obj, *args, **kwargs)

class Foo:
    __metaclass__ = MyType    # 对象类Foo被MyType原类创建
    def __new__(cls, *args, **kwargs):
        print("Foo  __new__")
        return object.__new__(cls)  # cls是对象类本身__new__在__init__之前执行,创建实例要用
    def __init__(self, name):
        self.name = name
        print("Foo  __init__")

f = Foo("Tommy")
####----Python2中的输出结果:
# ---MyType init---
# ---MyType call---
# Foo  __new__
# Foo  __init__
#############################

创建过程图示:

 

 

posted on 2018-07-23 21:41 要一直走下去 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/staff/p/9357110.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值