16.面向对象后续

1.静态方法和类方法
1.1静态方法
属于类,而不是属于实例的方法,在调用实例方法时,不需要传入(self)作此参数,不依赖类的实例,不能访问实例属性和实例方法
通过@staticmethod装饰器声明.
写在类里面的函数,让一个函数从属于一个类,封装更加完善
类和实例都可以访问
静态方法通常用于执行与类相关的任务,但不依赖于类的实例状态或属性的操作,可以用于辅助函数,工具函数或者用于撞见对象的辅助方法等

class A:

    @classmethod
    def any_print(xxx):
        print("class_print")

A.any_print(xxx='afjga')

创建对象辅助方法:

class Date:

    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    def __str__(self):
        return f'{self.year}/{self.month}/{self.day}'

    @staticmethod
    def string_data(_string):
        _a_list = string.split('-')
        obj = Date(int(_a_list[0]), int(_a_list[1]), int(_a_list[2]))
        return obj

if __name__ != '__main':
    a = Date(2024, 6, 11)
    print(a)
    string = '2024-06-25'
    b = Date.string_data(string)
    print(b)

1.2类方法:
相似@classmethod
属于类不是实例,第一个参数是cls表示类本身,而不是实例.
特点:
通过cls参数,类方法可以访问和修改类级别的属性方法.
通过类名或实例调用.在调用时,不需要传入实例(self)作为参数.
可以访问类级别的属性和方法,类方法第一个参数是本身.

class B:
    a = 5

    @classmethod
    def string(cls):
        cls.a = 8
        print(cls.a)

B.string()

2.property
将方法转换成只读属性
@property装饰过后的方法会被当做属性处理,是不可调用的.
可以与name.setter一起用设置值

class Age:

    def __init__(self):
        self.__age = 10

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, value):
        self.__value = value


a = Age()
a.value = 20
print(a.value)

@property还可以用作动态属性.

import time

from datetime import datetime


class Date:

    def __init__(self):
        pass

    @property
    def now(self):
        return datetime.now()


    def print_now(self):
        for i in range(1, 100):
            time.sleep(0.2)
            print(f'现在时间为:{self.now}')


a = Date()
a.print_now()

3.getattr和setattr
获取和设置,提供了一种在运行时操作对象属性的方法
getatter(object,name,default)
object表示获取属性的对象,
name表示获取的属性名.
default:属性不存在时返回的默认值.默认None
没有指定时,并且没有返回参数,会抛出异常
setatter(object, name, value)
对类也同样适用

class Person:

    def __init__(self, name, age):
        self.name = name
        self.age = age


person = Person('张三', 20)
a = getattr(person, 'name', '某某人')
b = getattr(person, 'age', '18')
c = getattr(person, 'gender', '男')
print(a, b, c,)
setattr(person, 'gender', '女')

    def __init__(self, name, age):
        self.name = name
        self.age = age
        setattr(self, 'gender', '女')

4.isinstance和type
isinstance(object, classinfo)
object表示检查类型的对象.
classinfo表示要比较的类型,可以是类型对象或类型元组.
如果前者是后者的类型则返回True
issubclass(a, b)是不是子类
type()判断是从哪一个类里面出来的实例

class A:
    pass

class B:
    pass



a = A()
b = B()

print(type(a))
print(type(b))

5.一切皆对象
__bases__查看基类,所有的类推到最后都是继承于object,object是所有类的顶层基类
print(str.bases)
所有的东西都是type的实例,所有的东西都是object的子类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值