python3関連

1.クラス
    クラス名の作成方法
        パス
        
2.メソッド作成メソッドを作成します
    __init __(self、arg)
        obj = class( 'a1')
    通常のメソッド
        obj = class( 'xxx')
        obj。通常のメソッドname()
        
3。オブジェクト指向の3つの特性の1つ:カプセル化


    クラスBar:
        def __init __(self、n、a):             self.name =
            n
self.age = a
            self.xue = 'o'
            
    b1 = Bar( 'alex'、123)
    
    b2 = Bar( 'eric'、456)
    
    
4.該当するシナリオ:
        複数の関数に同じパラメーターがある場合は、オブジェクト指向


    クラスDataBaseHelper に変換します
    
        def __init __(self、ip、port、username、pwd):
            self.ip = ip
            self.port = port
            self.username = username
            self.pwd = pwd
        
        def add(self,content):
            # 利用self中封装的用户名、密码等   链接数据
            print('content')
            # 关闭数据链接
        
        def delete(self,content):
            # 利用self中封装的用户名、密码等   链接数据
            print('content')
            # 关闭数据链接
        
        def update(self,content):
            # 利用self中封装的用户名、密码等   链接数据
            print('content')
            # 关闭数据链接
            
        def get(self,content):
            # 利用self中封装的用户名、密码等   链接数据
            print('content')
            # 关闭数据链接


s1 = DataBaseHelper('1.1.1.1',3306, 'alex', 'sb')


5、面向对象三大特性之二:继承


    1、继承
        
        class 父类:
            pass
            
        class 子类(父类):
            pass
            
    2、重写
        防止执行父类中的方法
        
    3、self永远是执行改方法的调用者


    4、
       super(子类, self).父类中的方法(...)
       父类名.父类中的方法(self,...)
       
       
       
    5、Python中支持多继承


        a. 左侧优先
        b. 一条道走到黑
        c. 同一个根时,根最后执行
    
6、面向对象三大特性之三:多态
    ====> 原生多态
    
    # Java
        string v = 'alex'
        
        def func(string arg):
            print(arg)
            
        func('alex')
        func(123)
    
    # Python 
        v = 'alex'
        
        def func(arg):
            print(arg)
            
            
        func(1)
        func('alex')


    
 
==================================================================
    
练习:
    
    class Person:
        
        def __init__(self,n,a,g,f):
            
            self.name = n
            self.age =a 
            self.gender =g
            self.fight = f 


                
    role_list = []
    
    y_n = input('是否创建角色?')
    if y_n == 'y':
        name = input('请输入名称:')
        age = input('请输入名称:')
        ...
        role_list.append(Person(....))
        
    # role_list,1,2 
        
        
======================================================= 面向对象中高级 ========================================================




class Foo:


    def __init __(self、name):
        #共通フィールド
        self.name = name


    #共通メソッド
    def show(self):
        print(self.name)


obj = Foo( 'alex')
obj.name
obj.show()




クラスメンバー:
    #フィールド-
        通常のフィールド、オブジェクトに格納、実行はオブジェクトにのみアクセスできます-
        静的フィールド、クラスに保存、実行はオブジェクトまたはクラスを通じてアクセスできます
        
    #メソッド-
        通常のメソッド、クラスに保存、オブジェクトによって呼び出し、self =》 object
        -staticメソッド、クラスに保存、クラスによって直接呼び出される-classメソッド、
        クラスに保存、クラスによって直接呼び出される、cls =》現在のクラス


    ########アプリケーションシナリオ:
        if一部の値はオブジェクトに保存する必要があります。特定の機能を実行するときは、オブジェクトの値を使用する必要があります->通常のメソッド
        はオブジェクトに値を必要としません、静的メソッド
        
        
    #属性、特性
        -nondescript
        
    

    

class provence:
    #静态字段,属于类
    country = "中国"
    def __init__(self,name):
        #普通字段,属于对象
        self.name = name

    @staticmethod # 使用装饰器,得到静态方法,类可直调用
    def static_func():
        print("静态方法")
        return 1
    @classmethod   # classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。
    def classmd(cls): #cls是当前类
        print("1111222333_class_method")

    @property  #类似属性字段调用
    def func(self):
        print("@property装饰的方法类似属性字段调用")
        return self.name
    @func.setter  #设置func的值执行函数, hebei.func = "set the attribute"
    def func(self,value):
        print(value)

provence.static_func()
provence.classmd()
hebei = provence("河北")
print("property:",hebei.func)  # 属性字段方法调用不用括号 执行@property 装饰函数
hebei.func = "set the attribute"  #执行@func.setter 装饰的函数
print(hebei.static_func())
print(hebei.name,hebei.country)
print(provence.country)

#修改对象的字段
hebei.name = "河北省"
print(hebei.name)

#修改静态字段
provence.country="China"
print(provence.country) #修改静态字段
print(hebei.country)
henan = provence("河南")
print(henan.country)

 

  シングルトンモード、インスタンス化されたオブジェクト

 

#创建单例模式的对象,即实例化的对像仅一个一直用
class foo:

    __v = None # 私有字段
    @classmethod  # classmethod修饰的方法不需要进行实例化, 进行创建单例模式对象
    def get_instance(cls):
        if cls.__v:
            return cls.__v
        else:
            cls.__v = foo()
            return cls.__v

#此处实例化的对象均为同一个
obj1 = foo.get_instance() 
print(obj1)
obj2 = foo.get_instance()
print(obj2)
obj3 = foo.get_instance()
print(obj3)


    
オブジェクト指向の知識で表現された中国のすべての省?


クラスProvince:
    #
    国に属する静的フィールド= 'China'
    
    
    def __init __(self、name):
        #オブジェクトに属する通常のフィールド
        self.name = name henan
        
= Province( '河南')
henan.name
henan.name = "河南南 "




#hebei = Province( '河北')

 

 

 

#Province.country

 

 

 

 

 

プライベートフィールドメソッド:

class bar:
    def __init__(self):
        self.name = "hello"
        self.__age = "World" # 私有变量,外部无法直接访问,通过构造函数访问
    def show(self): #构造函数的访问私有字段
        print(self.__age)

    def __func_show(self):
        print("父类的私有方法访问")

    def func_show(self): #构造函数间接调用私有函数
        self.__func_show()

class ch_bar(bar):
    def __init__(self,ge,go):
        self.ge = ge
        self.__go = go
        super(ch_bar,self).__init__() #执行父类的init

    def show(self):
        print(self.__go) #子类的私有字段
        print(self.name) #父类的共有字段
        super(ch_bar,self).show() #执行父类中的show方法
        # print(self.__age) #父类的私有字段,子类无法访问,私有字段只能在当前类中被访问

    def __func_show(self): #私有方法
        print(self.ge+'-'+self.__go)

    def func_show(self): #构造函数间接调用私有方法
        self.__func_show()

obj = ch_bar("python",'Class')
obj.show()
obj.func_show()
obj2 = bar()
obj2.func_show()
class foo:
    """
    类里面的特殊成员
    """
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __getitem__(self, item): # 对应对象后加[]的操作获取值
        return self.age
    def __setitem__(self, key, value):
        print("%s->%s"%(key,value))
    def __delitem__(self, key):
        print("delete:%s"%key)


lt = foo("QQ",10)
d= lt.__dict__  #获取对象中的成员变量,以字典形式返回
print(d)
r = lt[1]
print(r)
lt[5]="qwert" # 执lt对象中的__setitem__()方法,5当作参数传递给key,"qwert" 传给value
del lt[5] #执行lt对象中的__delitem__()方法

 

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

    def __iter__(self):
        s = iter([self.name,self.age])
        return s  #返回一个迭代对象
    n = 0 #静态字段
    def __next__(self):
        n = f.n #静态字段赋值
        l = [self.name,self.age]
        value = l[n]
        f.n += 1
        return  value

foo = f('zhansan',12)
print(next(foo))
print(next(foo))
for i in foo:
    print(i)

 

 

 

class ch_type(type): # python的type类作为父类,ch_type继承type类
    def __init__(self,*args,**kwargs):
        print("123")
        pass

class foo(object,metaclass=ch_type): #新建类对象,ch_type类作为祖类
    def __init__(self):
        pass
    def func(self):
        print("hello metaclass")

    def __call__(self, *args, **kwargs):  # __call__()方法对象加括号调用call方法
        print("foo()()直接调用__call__()函数")

obj= foo() #创建对象obj,执行foo的__init__()函数
obj()   #对象加() 执行foo中的__call__()函数

例外キャッチ処理

try:
    l=[1,2,3]
    x= l[4]
    int("qwer")
except ValueError as e:  #抛出异常ValueError
    print("ERROR:",e)
except Exception as e:  #抛出任何异常 按代码执行顺序从上往下,有特定的error就直接抛出
    print("Error:",e)
finally:
    print("finally执行")


#自定义异常类
class BadError(Exception): #从Exception继承
    def __init__(self,message):
        self.msg = message

    def __str__(self):
        return self.msg

import time
nowtime = time.localtime()
t = time.strftime("%Y-%m-%d %H:%M:%S",nowtime)
try:
    raise BadError("报错了") #主动触发异常
except BadError as  e: #写入到log文件
    error = str(e)
    with open ("log.f1",'a',encoding="utf-8") as f: 
        f.write(t+error+"\n")

assertは、例外がスローされることをアサートします

#assert 断言,条件不满足就直接报错, 可以捕获,一般不用捕获
assert  1==2 #条件不满足 直接报错,程序停止继续执行
print("123")

 

反射

 

class foo:

    def __init__(self,name,age):
        self.name = name
        self.age = age
    def show(self):
        return "%s->%s"%(self.name,self.age)

obj = foo("Jim",18)
# print(obj.name)
# b = "name"
# print(obj.b) # AttributeError: 'foo' object has no attribute 'b'
b = "name"
print(obj.__dict__[b])  # obj.__dict__ 将对象的字段属性转换为字典,拿到对象的字段
print(obj.__getattribute__(b))  #通过__getattribute__()获取字段的值,b="name"作为字段名
value = getattr(obj,b)  #getattr()方法获取字段值
print(value)
#用getattr()方法获取类里面的方法
func = getattr(obj,"show")
print(func)
ret = func()
print(ret)
#用hasattr()方法判断类中是否有某个字段或者方法
print(hasattr(obj,"show")) #返回True
print(hasattr(obj,b))

#setattr()方法设置属性或者方法
setattr(obj,"key","value")  # 设置后字段名和值存在对象的内存空间中
print(hasattr(obj,"key")) # 返回True
print(getattr(obj,"key")) #返回Value
#deleattr() 删除字段
delattr(obj,"key") #删除key字段名
print(hasattr(obj,"key")) #返回False
getattr(obj,"key")  # AttributeError: 'foo' object has no attribute 'key'

 リフレクションを使用して、いくつかのことを実行したり、他のモジュール関数や変数フィールド値を取得したりします。

#tests.py模块
class foo:

    def show1(self):
        print("首页")

    def show2(self):
        print("博客")

    def show3(self):
        print("下载")

#反射方式访问执行tests.py中的功能
import tests
obj = tests.foo() #tests中的类创建对象
while True:
    inp = input (">>:") #输入show1/show2/show3
    if hasattr(obj,inp):
        func = getattr(obj,inp) #获取方法
        func() #执行对应的方法
    else:
        print("Not Found")

 

 

 

 

 

おすすめ

転載: blog.csdn.net/dance117/article/details/80973658