面向对象基础(三)

# 面向对象继承的主要作用是
# 优化代码,节省代码.
# 提高代码的复用性.
# 提高代码的维护性.
# 让类与类之间发生关系.

# 例:
class Parent:
    def __init__(self):
        self.func()

    def func(self):
        print('Parent')

class Son(Parent):
    def __init__(self):
        self.func()

    def func(self):
        print('Son')

son1 = Son()
# result:Son,继承中优先使用派生类中的方法

class A:
    lst = []


p1 = A()
p2 = A()
p1.lst.append(1)

print(p1.lst,p2.lst,A.lst)

# result:[1] [1] [1],列表是可变数据类型,这里可以参考函数默认值使用的都是同一块内存地址


class A:
    name = 'Tian'


p1 = A()
p2 = A()
p1.name = 'wuser'

print(p1.name,p2.name,A.name)

# result:wuser Tian Tian str类型是可hash的对象只能访问类的静态字段无法修改
# python中是没有接口这个概念的
# 接口类,抽象类: 制定一个规范。
# 归一化设计

class Alipay:
    def __init__(self,money):
        self.money = money

    def pay(self):
        print('支付了%s' %self.money)


class Jdpay:
    def __init__(self,money):
        self.money = money

    def pay(self):
        print('支付了%s' %self.money)


apay = Alipay(100)
jpay = Jdpay(200)

apay.pay()
jpay.pay()
# 支付是一个统一的概念,这里明显无法统一,那如何实现统一

def pay(obj):
    obj.pay()
pay(apay)

# 这样是不是看起来统一了,这就是归一化设计抽象类也是借鉴了这个概念
from abc import ABCMeta,abstractmethod

class Payment(metaclass=ABCMeta):
        #装饰器 制定一个规范当派生类缺失pay方法时会报错
        @abstractmethod
        def pay(self): pass  # 制定了一个规范



class Alipay(Payment):
    def __init__(self,money):
        self.money = money

    def pay(self):
        print('支付了%s' %self.money)


class Jdpay(Payment):
    def __init__(self,money):
        self.money = money

    # def pay(self):
    #     print('支付了%s' %self.money)

apay = Alipay(100)
jpay = Jdpay(200)

# result:TypeError: Can't instantiate abstract class Jdpay with abstract methods pay
# python中没有多态的概念,但他有鸭子类型

# class Str:
#     def index(self):
#         pass

# class List:
#     def index(self):
#         pass
#
# class Tuple:
#     def index(self):
#         pass

# 当三个类中的方法相同时我们称其为鸭子类型
# 广义的封装: 实例化一个对象,给对象空间封装一些属性.
# 狭义的封装: 私有制.
# 私有成员:私有静态字段,私有方法,私有对象属性

class A:
    # 这就是A类的私有静态字段只有在A类内部调用时才能访问,外部无论是派生类还是实例都无法访问
    __money = 1000

a1 = A()

# print(a1.__money)
# print(A.__money)
# 报错,这里有个bug因为python设计的时候会在私有字段前面加类名
print(a1._A__money)
# 这是python设计问题没有人会这么用

class Parent:
    def __func(self):
        print('in Parent func')

    def __init__(self):
        self.__func()

class Son(Parent):
    def __func(self):
        print('in Son func')

son1 = Son()

# result:in Parent func
class Person:
    def __init__(self,name,sex,age):
        self.__name = name
        self.__sex = sex
        self.age = age

    def func(self):
        print(self.__name)


p1 = Person(1,2,3)

# print(p1.__name)  报错
p1.func()
# 在类内部执行__name时他会在前面添加_Person

 

posted on 2019-11-15 12:11  素心~  阅读(108)  评论(0编辑  收藏  举报

导航