Python中的类

 

1、概念

类是对象的一个抽象的概念 ,而对象(实例)就是由类创建的实例。

代码示例:

#类的创建 将汽车特点作为类中成员
class car():
    brand = '品牌'
    color = '颜色'
    pailiang = 2.0  # 排量

    def __init__(self, brand, color, pailiang=2.0):
        self.brand = brand
        self.color = color
        self.pailiang = pailiang

    def get_colore(self):
        return self.color

    def say(self):
        print('didi')

#对象创建 将具体的特点赋予类中的成员
bwm = car('宝马','白色','2.3')
benz = car('奔驰','黑色','2.0')

其中brand、color、pailiang表示类的属性;get_color()、say()表示类的方法。

2、封装(将一些重要的数据和信息放到一个空间,比如类和函数。)

class A:

    # 静态属性是一种封装
    country = "China"
    _area = "深圳"
    __phone = “12345678”

    # 给对象封装属性
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # 动态属性也是一种封装
    def func(self):
        print(666)

country是公有的,_area是受保护的,__phone是私有的。在类的内部都可以访问。在类的外部:公有的可以访问;受保护的python可以访问,其他语言不能;私有的都不能访问。无论是类名还是实例化对象对私有静态属性只能在类的内部访问。

class Boss:

    name = "Jane"
    __secretary = ["女", "男"]

    def __init__(self, username, password):
        self.username = username
        self.__password = password

    def func(self):
        self.__func()

    def __func(self):
        print(self.__secretary)

class Boss_son(Boss):

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


# 类外部访问类的私有静态属性
print(Boss.__secretary)
# 运行结果:
Traceback (most recent call last):
  File "test01.py", line 23, in <module>
    print(Boss.__secretary)
AttributeError: type object 'Boss' has no attribute '__secretary'

# 类内部的 func() 访问
b = Boss("aaa", 123)
b.func()        # ['女', '男']
b.__secretary   
# 运行结果:
Traceback (most recent call last):
  File "test01.py", line 30, in <module>
    b.__secretary   
AttributeError: 'Boss' object has no attribute '__secretary'


# 通过子类来访问
b1 = Boss_son("bbb", 222)
b1.func()
# 运行结果:
Traceback (most recent call last):
  File "test01.py", line 33, in <module>
    b1.func()
  File "test01.py", line 19, in func
    print(self.__secretary)
AttributeError: 'Boss_son' object has no attribute '_Boss_son__secretary'

3、继承(提高代码的重用性,建立新的类与类的关系,方便其它逻辑的操作)

class Animals():
    def breathe(self):
        print('breathing')
    def move(self):
        print('moving')
    def eat(self):
        print('eating food')

class Mammals(Animals):
    def breastfeed(self):
        print('feeding young')

class Cats(Mammals):
    def __init__(self,spots):
        self.spots = spots
    def catch_mouse(self):
        print('catch mouse')

4、多态(对于同一个方法,由于调用的对象不同,产生了不同形态的结果)

class car():
    brand = '品牌'
    color = '颜色'
    speed = 100 # 排量

    def __init__(self, brand, color, speed=100):
        self.brand = brand
        self.color = color
        self.speed = speed

    def run(self):
        print(f'我最快能跑{self.speed}km/h')

bwm = car('宝马','白色','200')
benz = car('奔驰','黑色','210')
bwm.run()
benz.run()

5、类的魔术方法(不需要手动调用就可以自动执行的方法)

类中的魔术方法就像已经造好的轮子,甚至不需要去调用它就能发挥作用,也可以在类中将它调用出来按照自己的需要进行修改,以满足自己的要求。

__init__ 初始化方法  *****
    触发机制:当实例化对象之后就会立即触发的方法
    作用:   为当前创建的对象完成一些初始化的操作,比如:成员属性的赋值,方法的调用,打开或创建一些资源。。
    参数:   一个self,接受当前对象,其它参数根据需求进行定义即可
    返回值: 无
    注意事项:无
__new__ 构造方法    ****
    触发机制:实例化对象时自动触发(在__init__之前触发)
    作用:   管理控制对象创建的过程
    参数:   一个cls 接收当前类,其它参数根据初始化方法的参数进行决定
    返回值: 必须返回object.__new__(cls)进行对象的创建,如果没有返回值,则实例化对象的结果为None
    注意事项:
            __new__方法的参数和__init__方法的参数要保持一致,除了第一个参数
            必须返回object.__new__(cls)进行对象的创建,如果没有返回值,则实例化对象的结果为None
    应用场景:设计模式中的单例设计模式
__del__ 析构方法    *****
    触发机制:当该类对象被销毁时,自动触发
    作用: 关闭或释放对象创建时打开或创建的一些资源
    参数: 一个self,接受当前的对象
    返回值:无
    注意事项: 无
__call__          ***
    触发机制: 把对象当作函数直接调用时自动触发
    作用:    一般用于归纳类或对象的操作步骤,方便调用
    参数:   一个self接收当前对象,其它参数根据调用需求缺点
    返回值:  可有可无
__len__
    触发机制: 当使用len函数去检测当前对象的时候自动触发
    作用:    可以使用len函数检测当前对象中某个数据的信息
    参数:    一个self 接收当前对象
    返回值:  必须有,并且必须是一个整型
    注意事项:len要获取什么属性的值,就在返回值中返回哪个属性的长度即可
__str__
    触发机制: 当使用str或者print函数对对象进行操作时自动触发
    作用:   代码对象进行字符串的返回,可以自定义打印的信息
    参数:  一个self,接收当前对象
    返回值: 必须有,而去必须是字符串类型的值

 

__repr__
    触发机制:在使用repr方法对当前对象进行转换时自动触发
    作用: 可以设置repr函数操作对象的结果
    参数:  一个self,接收当前对象
    返回值: 必须有,而去必须是字符串类型的值
    注意:正常情况下,如果没有__str__这个魔术方法,__repr__方法就会代替__str__魔术方法

 

__bool__
    触发机制: 当前使用bool函数转换当前对象时,自动触发.默认情况下,对象会转为True
    作用:    可以代替对象进行bool类型的转换,可以转换任何数据
    参数 :   一个self 接收对象
    返回值: 必须是一个布尔类型的返回值

 6、类的约束(对类进行一些正确的引导、约束和统一规范,满足正确的开发方式。以下所有示例循序渐进,可借此深入了解类的约束的形成过程)

(1)假设一个项目中有支付宝和 QQ 这两种支付方式

class Alipay:

    def pay(self, money):
        print("此次消费%s元" % money)


class QQpay:

    def pay(self, money):
        print("此次消费%s元" % money)

a = Alipay()
a.pay(100)      # 此次消费100元

q = QQpay()
q.pay(200)      # 此次消费200元

(2) 现在要统一支付功能,可以这样做

class Alipay:

    def pay(self, money):
        print("此次消费%s元" % money)

class QQpay:

    def pay(self, money):
        print("此次消费%s元" % money)

# 设计一个接口
def pay(obj, money):
    obj.pay(money)

# 实例化两种支付方式的类的对象
a1 = Alipay()
a2 = Alipay()
q = QQpay()

# 直接通过统一的支付接口 (即 pay()) 来调用两种支付方式
pay(a1, 100)
pay(q, 100)
pay(a2, 300)

(3)假设另一个程序员添加了一个微信支付接口,但是并没有使用统一的支付标准

class Alipay:

    def pay(self, money):
        print("此次消费%s元" % money)


class QQpay:

    def pay(self, money):
        print("此次消费%s元" % money)


class Wechat:
    # 不规范的写法,支付方法名变了
    def another_pay(self, money):
        print("此次消费%s元" % money)

# 这是一个隐藏的标准 
def pay(obj, money):
    obj.pay(money)

w = Wechat()
w.another_pay(300)

(4)制定一个统一的约束或标准,如果有父类,父类的方法只有一个 pass。其实就是制定了一个规范,表明子类一定要有 pay() 方法。

class A:

    def pay(self, money):
        pass


class Alipay(A):

    def pay(self, money):
        print("此次消费%s元" % money)


class QQpay(A):

    def pay(self, money):
        print("此次消费%s元" % money)


class Wechatpay(A):

    def another_pay(self, money):
        print("此次消费%s元" % money)


def pay(obj, money):
    obj.pay(money)

w1 = Wechatpay()
pay(w1, 100)
# w1 是类 Wechatpay 的一个实例化对象
# 当执行 pay(w1, 100) 时,类 Wechatpay 是没有 pay() 的
# 但是其父类 A 中有 pay(),只不过该方法里面只有 pass

(5) 上面的示例也从侧面说明类 A 不是强制性约束,为了起到决定性的作用,可以强制加一个约束,只要不按规则走就直接报错,

class A:

    # 如果子类没有定义这个方法,使用了父类的就报错
    def pay(self, money):
        raise Exception("该支付方式未定义pay方法")


class Alipay(A):

    def pay(self, money):
        print("此次消费%s元" % money)


class QQpay(A):

    def pay(self, money):
        print("此次消费%s元" % money)


class Wechatpay(A):

    def another_pay(self, money):
        print("此次消费%s元" % money)


def pay(obj, money):
    obj.pay(money)


w1 = Wechatpay()
pay(w1, 100)
# 运行结果:
Traceback (most recent call last):
  File "test01.py", line 31, in <module>
    pay(w1, 100)
  File "test01.py", line 27, in pay
    obj.pay(money)
  File "test01.py", line 5, in pay
    raise Exception("该支付方式未定义pay方法")
Exception: 该支付方式未定义pay方法

(6)其实就是父类对子类进行约束,子类必须要有某个方法。 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值