python面向对象(绑定方法与非绑定方法)

# 一、绑定方法:特殊之处在于将调用者本身当做第一个参数自动传入
#       1)绑定给对象的方法:调用者是对象,自动传入的是对象
#       2)绑定给类的方法:调用者是类,自动传入的是类


# 类方法的应用
# 需求一
class MySQL:
    def __init__(self, host, port):
        self.host = host
        self.port = port

    def func(self):
        print('{}:{}'.format(self.host, self.port))


obj1 = MySQL('127.0.0.1', 3306)
obj1.func()  # 绑定对象的方法,对象直接传入
# 127.0.0.1:3306
MySQL.func(obj1)
# 127.0.0.1:3306
print(obj1.__dict__)
# {'host': '127.0.0.1', 'port': 3306}

# 需求二(实例化传参,从配置文件中来)
import settings


class MySQL:
    def __init__(self, host, port):
        self.host = host
        self.port = port

    def func(self):
        print('{}:{}'.format(self.host, self.port))


obj2 = MySQL(settings.HOST, settings.PORT)
print(obj2.__dict__)


# 需求三(参数写活,构造函数,涉及到传类)
import settings


class MySQL:
    def __init__(self, host, port):
        self.host = host
        self.port = port

    def func(self):
        print('{}:{}'.format(self.host, self.port))

    @classmethod  # 将下面的函数装饰成绑定给类的方法
    def from_conf(cls):  # 从配置文件中读取配置进行初始化
        return cls(settings.HOST, settings.PORT)


obj3 = MySQL.from_conf()  # 调用类方法,自动将类MySQL当作第一个参数传给cls
print(obj3.__dict__)
print(MySQL.from_conf)
# <bound method MySQL.from_conf of <class '__main__.MySQL'>> 绑定到类
print(obj3.func)
# <bound method MySQL.func of <__main__.MySQL object at 0x000002C1EC073190>> 绑定到对象


# 二、非绑定方法--》静态方法
#       没有绑定给任何人:调用者可以是类、对象,没有自动传参的效果
class MySQL:
    def __init__(self, host, port):
        self.nid = self.create_id()  # 实例化几次,就调用create_id函数几次
        self.host = host
        self.port = port

    @staticmethod  # 将下述函数装饰成一个静态方法
    def create_id():
        import uuid
        return uuid.uuid4()


obj1 = MySQL('1.1.0.1', 3306)

MySQL.create_id()
obj1.create_id()
print(obj1.__dict__)
# {'nid': UUID('0eeba8ce-ce15-4f56-bd62-78c10a6230c4'), 'host': '1.1.0.1', 'port': 3306}
print(MySQL.create_id)
# <function MySQL.create_id at 0x0000021B017F2550> 没有自动传参的效果,普通函数,有几个参数就传几个参数
print(obj1.create_id)
# <function MySQL.create_id at 0x0000021B017F2550> 没有自动传参的效果,普通函数,有几个参数就传几个参数

总结绑定方法与非绑定方法的使用:若类中需要一个功能,

该功能的实现代码中需要引用对象则将其定义成对象方法、

需要引用类则将其定义成类方法、无需引用类或对象则将其定义成静态方法。

内置函数:

print(abs(-1))  # 绝对值
print(all([1, 'aaa', 'e']))  # and运算,返回布尔值
print(all([]))

print(any([0, None, 1]))  # or运算,返回布尔值
print(any([]))

print(bin(10))
print(oct(10))
print(hex(10))

print(bool(''))


class Foo:
    pass


print(callable(Foo))  # 是否可被调用

# -----掌握
print(divmod(1000, 33))  # 商和余数 (30, 10)


# -----掌握

class Foo:
    pass


obj = Foo()
obj.xxx = 1
print(dir(obj))  # obj.哪些属性

# -----掌握
for k, v in enumerate(['a', 'b', 'c']):  # 列表的索引和对应的值
    print(k, v)
'''
0 a
1 b
2 c
'''

# -----掌握
res = eval('2+3')  # 执行字符串中的表达式
print(res)  # 5


# -----掌握
class C1:
    pass


obj = C1()
print(isinstance(obj, C1))
print(isinstance([], list))  # 类型判断推荐使用isinstance
print(type([]) is list)  # 不推荐使用

time=__import__('time')

 

posted @ 2023-04-14 03:04  coder雪山  阅读(17)  评论(0编辑  收藏  举报