01类内置方法

yfjly yfjly     2022-12-03     626

关键词:

# 写一个单例类
# __名子__
# 类中的特殊方法、内置方法
# 双下方法
# 魔法方法

# __call__ flask
# __new__ 特别重要 写一个单例类
# __len__
# __str__ /__repr__

__call__

# __call__ flask

class A:
    def __call__(self, *args, **kwargs):
        print("执行__call__方法")
#
# a = A()
# a()   # 对象加()执行call方法
# A()()
#
# # 执行__call__方法
# # 执行__call__方法

class B:
    def __init__(self,cls):
        print("在实例化A之前做一些事情")
        self.a = cls()
        self.a()
        print("在实例化A之后做一些事情")
B(A)   # 很多源码都是这样写的

 

__len__  对对象执行len函数里面必须要有__len__方法

# __len__
#len()
# __iter__
#iter
# __next__
# next()
# l = [1,2,3]
#
# def it(obj):
#     return obj.__iter__()
# # print(it(l))

class Mylist():
    def __init__(self):
        self.lst = [1,2,3,4,5,6]

    def __len__(self):
        print("执行__len__函数")
        return len(self.lst)   # 在对对象进行操作时,可以修改,让len执行你想要的操作


l = Mylist()
# print(l.lst)
# print(len(l))  # TypeError: object of type ‘Mylist‘ has no len()  对象没有长度。添加__len__ 函数

# print(len(l))  # 执行对象里面的len函数  # 当需要执行对象的len函数时,类里面必须有__len__函数

# 执行外部的len函数
ab = [1,2,3,4]
print(len(ab))

#
# self.s  = ""
# len(obj)   = str长度

class Test:
    def __init__(self,s):
        self.s = s
    def __len__(self):
        return len(self.s)
t = Test("abafhaifhakj")
print(len(t))

__new__  单例类  (构造方法) __init__ 不是构造方法,是初始化方法

class Single:
    def __new__(cls, *args, **kwargs):
        obj = object.__new__(cls)
        print("在new方法里面", obj)
        return obj   # 这里执行new方法,返回对象空间。在执行new方法时,传递cls,因为此时没有对象空间self ,所哟只能传递cls 类空间
    # 正常情况下不需要执行new函数,因为继承的objecr会自动执行

    def __init__(self):
        print("init",self)


# 实例化过程中先开辟一个空间,属于对象的
# 把对象空间传递给self ,执行init
# 将这个对象空间返回给调用者
obj = Single()
# 在new方法里面 <__main__.Single object at 0x000001B97B41B4A8>
# init <__main__.Single object at 0x000001B97B41B4A8>
# 先执行Single的new方法,Single里面没有,所以执行Object里面的new方法
# new方法在实例化对象的时候,在__init__之前

# 单例类 如果一个类只能创建一个实例.只开辟一个空间,那么这个类就是单例类

class B:
    __ISINSTANCE = None
    # def __new__(cls, *args, **kwargs):
    #     global obj
    #     if not cls.__ISINSTANCE:
    #         obj = object.__new__(cls)
    #         cls.__ISINSTANCE = True
    #     return obj  # UnboundLocalError: local variable ‘obj‘ referenced before assignment  赋值之前引用了局部变量obj
    def __new__(cls, *args, **kwargs):
        if not cls.__ISINSTANCE:
            cls.__ISINSTANCE = object.__new__(cls)
        return cls.__ISINSTANCE # UnboundLocalError: local variable ‘obj‘ referenced before assignment  赋值之前引用了局部变量obj

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


b1 = B("ly",999)
b2 = B("dudu",666)
print(b1.name)
print(b2.name)

 

__str__

# __str__
l = [1,2,3] # 相当于实例化一个list的对象
# # l 是一个对象
print(l)

class Student:
    # def __str__(self):
    #     return "  ".format(self.name,self.school,self.age)

    def __init__(self,name):
        self.name = name
        self.school = "good"
        self.age = 26

ly = Student("liuy")
print(ly.name)
# print(ly)
print(str(ly)) 
# print("学生1: %s" % ly)

# print一个对象相当于调用一个对象的__str__ 方法
# 实现强转时,str(obj)相当于执行__str__方法
# str(obj)相当于执行obj.__str__方法
# %obj 相当于执行obj.__str__ 方法

所有的魔术方法没有需要在外面直接调用的,通常在类里面实现这些方法,然后在外部通过对象调用时,可以影响这些方法

python学习10内置属性对象属性类属性私有属性私有方法对象方法类方法静态方法(代码片段)

内置属性创建类时系统自动创建的属性#内置属性:dir(对象),列出所有的内置属性classPerson(object):'''Person类1'''#Person类2__slots__=('name','age')def__init__(self,name,age):self.nam 查看详情

类的属性类的方法类的内置方法

...调用,定义的时候以双下划线开头,如__color=‘yellow‘(3)内置属性:由系统在定义类的时候默认添加的,定义的时候以前后双下划线构成,如dict#!/usr/bin/e 查看详情

面向对象的进阶---反射--一些内置方法

反射反射和一些类的内置方法1isinstance----issubclasstype()--判断是不是ininstance(object,cls)判断是不是类的对象如果这个类有父类这个对象也是这个父类的对象issubclaaa(cls,cls)判断一个类是不是另一个类的子类=============================反射... 查看详情

反射和类内置方法(代码片段)

#classTeacher:#dic=‘查看学生信息‘:‘show_student‘,‘查看老师‘:‘show_teacher‘##defshow_student(self):#print(‘showstudent‘)##defshow_teacher(self):#print(‘showteacher‘)##@classmethod#deffunc(cls):#print(‘func‘)## 查看详情

委托+内置委托方法

委托概念:如果我们要把方法当做参数来传递的话,就要用到委托。简单来说委托是一个类型,这个类型可以赋值一个方法的引用。 声明委托:在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段... 查看详情

反射内置方法(代码片段)

  反射~~~  反射 使用字符串数据类型的变量名来获取这个变量的值反射类中的变量:静态属性 类方法  静态方法classFoo:school=‘qinghua‘#静态属性country=‘China‘language=‘English‘@classmethod#类方法defclass_method... 查看详情

在 C++ 中扩展内置类

】在C++中扩展内置类【英文标题】:Extendingbuilt-inclassesinC++【发布时间】:2021-09-0614:15:51【问题描述】:我知道已被弃用,但出于某些原因我仍然想这样做。我想将我的自定义方法添加到从std::string类扩展/继承的类(str)(这是一... 查看详情

3.2面向对象基础语法(代码片段)

面向对象基础语法目标dir内置函数定义简单的类(只包含方法)方法中的self参数初始化方法内置方法和属性01.dir内置函数(知道)在Python中对象几乎是无所不在的,我们之前学习的变量、数据、函数都是对象在Python中可以使用... 查看详情

27反射类的内置方法

一、反射1、什么是反射?  用字符串类型的名字去操作变量2、反射对象中的属性和方法  getattrhasattrsetattrdelettr3、 getattr:通过字符串类型的名字取到变量的值  hasattr:判断字符串类型的名字对应的值是否存在  set... 查看详情

28.python面向对象类:创建类&实例对象,私有属性,类里面的方法,类属性crud,常用内置类属性

目录:每篇前言:Python面向对象(一)1.1面向对象基础1.1.1创建类1.1.2创建实例对象1.1.3私有属性1.1.4类里面的方法1.1.5访问对象的属性1.1.6python内置类属性每篇前言: 查看详情

28.python面向对象类:创建类&实例对象,私有属性,类里面的方法,类属性crud,常用内置类属性

目录:每篇前言:Python面向对象(一)1.1面向对象基础1.1.1创建类1.1.2创建实例对象1.1.3私有属性1.1.4类里面的方法1.1.5访问对象的属性1.1.6python内置类属性每篇前言: 查看详情

classmethodstaticclassmethod内置装饰器函数(代码片段)

...可以调用这个方法去修改类的静态属性,此时可以用这个内置装饰器函数#staticmethod静态方法#类的方法classmethodclassGoods:discount=0.5#折扣def__init__(self,name,price):self.name 查看详情

java基础整理-22.java内置包装类

JavaObject类详解:Object类的常用方法(equals()和getClass())  Object是 Java 类库中的一个特殊类,也是所有类的父类。当一个类被定义后,如果没有指定继承的父类,那么默认父类就是Object类。  在Object类中定义的方法,... 查看详情

内置方法(代码片段)

内置方法一isinstance(obj,cls)和issubclass(sub,super)isinstance(obj,cls)检查是否obj是否是类cls的对象classFoo(object):passobj=Foo()isinstance(obj,Foo)issubclass(sub,super)检查sub类是否是super类的派生类classFoo(object):passclassBar 查看详情

是否有 Python 方法可以访问类的所有非私有和非内置属性?

】是否有Python方法可以访问类的所有非私有和非内置属性?【英文标题】:IsthereaPythonmethodtoaccessallnon-privateandnon-builtinattributesofaclass?【发布时间】:2013-06-0903:07:50【问题描述】:我想调用一个方法来给我一个包含所有“非私有”... 查看详情

day27反射内置方法

一、isinstance和issubclassclassFoo:passclassSon(Foo):passs=Son()#判断一个对象是不是这个类的对象,传两个参数(对象,类)#print(isinstance(s,Son))#print(isinstance(s,Foo))#print(type(s)isSon)#print(type(s)isFoo)#判断一个类是不是另一类的子类,传两个参数 查看详情

面向对象之内置方法(代码片段)

标签(空格分隔):内置方法面向对象里的内置方法:一、isinstance(obj,cls)和issubclass(sub,super)isinstance(obj,cls)检查是否obj是否是类cls的对象;例如:classFoo(object):passobj=Foo()isinstance(obj,Foo)issubclass(sub,super)检查sub类是否是super类的派生... 查看详情

内置方法(代码片段)

isinstance(obj,cls)和issubclass(sub,super)isinstance(obj,cls)检查是否obj是否是类cls的对象classFoo(object):passobj=Foo()isinstance(obj,Foo)issubclass(sub,super)检查sub类是否是super类的派生类classFoo(object):passclassBar(Foo) 查看详情