标签:attr 活性 同名 sel uuid read 返回 index host
类和对象
#类通过函数改变class Person: def __init__(self,name,age,money): self.name=name self.age=age self.money=money def shopping(self): self.money=self.money -200 print(self.money)long=Person("龙",18,400)hu=Person("虎",18,300)long.shopping()hu.shopping()# 200# 100class Foo: count=0 def __init__(self,name): Foo.count+=1 #写Foo.count Foo代表类 self.name=nameobj1=Foo("egon1")obj2=Foo("egon2")# print(Foo.count)# print(obj2.count)class Student: tag = "tag值" #灵活性,可增加参数 def __init__(self,ID,name,age): self.id=ID self.name=name self.age=age def walk(self): print("%s is waokking"%self.name)s1=Student(1,"egon",18)s2=Student(2,"alex",1000)s1.walk()s2.walk()print(s1.id,s1.name,s1.age,s1.tag)print("用户数量",Foo.count)# egon is waokking# alex is waokking# 1 egon 18 tag值# 用户数量 2
class c1: def __init__(self,name,obj): self.name = name self.obj=objclass c2: def __init__(self,name,age): self.name = name self.age=age def show(self): print(self.age)c2_obj=c2("aa",11) #c2("aa", 11).show() 这样也行c2_obj.show() #显示show函数值#11print(c2_obj.name) #也可以调用变量,显示变量要加print#aac1_obj=c1("alex",c2_obj) #c1_obj的参数可以是c2_obj函数print(c1_obj.obj.name) #c1_obj.obj.name =c2_obj.name#aaclass F1: def show(self): print("show")class F2(F1): def bar(self): print("bar your right")obj = F2()obj.bar()#bar your rightclass F1: #父类,基类 def show(self): print("show") def foo(self): print(self.name)class F2(F1): #子类,派生类 def __init__(self,name): self.name = name def bar(self): print("bar your right") def show(self): print("F2,show")obj = F2("alex")obj.foo()class Animal: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def eat(self): print("%s eat"%self.name) def takl(self): print("%s say"%self.name)class People(Animal): def __init__(self,name,age,sex,education): Animal.__init__(self,name,age,sex) #这是调用父类初始化 self.education=educationpeo1=People("alex",18,"male","小学")print(peo1.__dict__) #不加__dict__是内存地址class Animal: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def eat(self): print("eating") def talk(self): print("="*8) print("%s 在干嘛" %self.name)class People(Animal): def __init__(self,name,age,sex,education): Animal.__init__(self,name,age,sex) self.education=education def talk(self): Animal.talk(self) print("%s say hello %s"%(self.name,self.education))class Pig(Animal): def __init__(self,name,age,sex): Animal.__init__(self,name,age,sex) def talk(self): Animal.talk(self) #执行Peple中的tailk子类优先 print("%s 哼哼哼"%self.name)class dig(Animal): def __init__(self,name,age,sex): Animal.__init__(self,name,age,sex) def talk(self): Animal.talk(self) #执行Peple中的tailk子类优先 print("%s 汪汪汪汪"%self.name)peo1=People("alex",18,"male","小学文凭")pig=Pig("wupeiqi",20,"female")dig=dig("haha",20,"male")#print(peo1.education)peo1.talk()pig.talk()dig.talk()class People: def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex# class Teacher(People):# def __init__(self,name,age,sex,salary):# People.__init__(self,name,age,sex)# self.salary=salary# # class Student(People):# passclass Date: def __init__(self,year,mon,day): self.year=year self.mon=mon self.day=day def tell(self): print(‘%s-%s-%s‘ %(self.year,self.mon,self.day))class Teacher(People): def __init__(self,name,age,sex,salary,year,mon,day): self.name=name self.age=age self.sex=sex self.salary=salary self.birth=Date(year,mon,day) #组合调用class Student(People): def __init__(self,name,age,sex,year,mon,day): self.name=name self.age=age self.sex=sex self.birth=Date(year,mon,day)t=Teacher(‘egon‘,18,‘male‘,3000,1995,12,31)t.birth.tell()#先查C1的所有父类,有f2,匹配退出,如果没有,再查C1,有f2,匹配退出,都没有报错
class C1: def f2(self): print("C1中的f2")class C2: def f2(self): print("C2中的f2")class C3(C1,C2): def f3(self): print("C3中的f3")obj=C3()obj.f2()#新式类, 特定是N条父类连接相同父父类, 最后一条生效#查询顺序 C3(自己)-C2-C1-C5-C4-C0 class C0: def test(self): print("C0")class C1(C0): # def test(self): # print("C1") passclass C2(C1): # def test(self): # print("C2") passclass C4(C0): # def test(self): # print("C4") passclass C5(C4): # def test(self): # print("C5") passclass C3(C2,C5): # def test(self): # print("C3") passobj=C3()obj.test()print(C3.mro())
#[<class ‘__main__.C3‘>, <class ‘__main__.C2‘>, <class ‘__main__.C1‘>, <class ‘__main__.C5‘>, <class ‘__main__.C4‘>, <class ‘__main__.C0‘>, <class ‘object‘>]
class Animal: home="oldboy" def __init__(self,name,age,sex): self.name=name self.age=age self.sex=sex def eat(self): print("%s eat"%self.name) def takl(self): print("%s say"%self.name)class People(Animal): def __init__(self,name,age,sex,education): #Animal.__init__(self,name,age,sex) #这是调用父类初始化 super().__init__(name,age,sex,) #这是调用父类初始化的另一种方法 #super(People,self).__init__(name,age,sex,) #python2写法 #print(super().home) #使用super.可直接调用父类的(对象,函数,变量) = print(Animal.home) self.education=educationpeo1=People("alex",18,"male","小学")print(peo1.__dict__) #不加__dict__是内存地址#{‘name‘: ‘alex‘, ‘age‘: 18, ‘sex‘: ‘male‘, ‘education‘: ‘小学‘}peo1.eat()#alex eatprint(People.mro()) #查新式类最后调用#[<class ‘__main__.People‘>, <class ‘__main__.Animal‘>, <class ‘object‘>]#super的另一种含义是直接调用最后一个父类class A: def test(self): super().test() #此时的super是从<class ‘__main__.A‘>后 继续调用mro继续查看,继续则是C(B),得到B父类的testclass B: def test(self): print(‘B‘)class C(A,B): pass# a=A()# a.test()print(C.mro())c=C()c.test()#[<class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘__main__.B‘>, <class ‘object‘>]#B #主要作用:函数规范 , 只要是调用这个父级的read函数 子级也必须用readimport abc #利用abc模块实现抽象类class All_file(metaclass=abc.ABCMeta): all_type=‘file‘ @abc.abstractmethod #定义抽象方法,无需实现功能 def read(self): ‘子类必须定义读功能‘ pass #定义其他抽象类就继续仿照read写class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法 def read(self): print(‘文本数据的读取方法‘)class Process(All_file): #子类继承抽象类,但是必须定义read和write方法 def read(self): print(‘进程数据的读取方法‘)guolm=Txt()qiqi=Process()#规范了必须用read函数, 如果把guolm的类中read函数名改变,就会报错#Can‘t instantiate abstract class Txt with abstract methods read guolm.read()qiqi.read()print(guolm.all_type)print(qiqi.all_type)# 文本数据的读取方法# 进程数据的读取方法# file# fileclass Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abstractmethod #抽象 def talk(self): passclass People(Animal): #动物的形态之一:人 def talk(self): print(‘say hello‘)class Dog(Animal): #动物的形态之二:狗 def talk(self): print(‘say wangwang‘)class Pig(Animal): #动物的形态之三:猪 def talk(self): print(‘say aoao‘)People=People()People.talk()Dog=Dog()Dog.talk()Pig=Pig()Pig.talk()# say hello# say wangwang# say aoao#类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果。#这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的。
#这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的。
#在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆盖的。class People: def __init__(self,name,age,sex): self.__name=name self.__age=age self.__sex=sex def tell_info(self): #print("人的名字是:%s,\n人的性别是:%s,\n人的年龄是:%s "%(self.__name,self.__age,self.__sex)) return "人的名字是:%s,人的性别是:%s,人的年龄是:%s "%(self.__name,self.__age,self.__sex)p=People("alex",18,"male")print(p.tell_info()) #显示结果#人的名字是:alex,人的性别是:18,人的年龄是:maleprint(p.__dict__) #显示p的字典状态#{‘_People__name‘: ‘alex‘, ‘_People__age‘: 18, ‘_People__sex‘: ‘male‘}class Parent: __x=1
def foo(self): print("from parent.foo") self.__bar() #值是完整文件名_parent__foo__bar, 相当于指定调用 def __bar(self): print("from parent.bar")class Sub(Parent): def bar(self): print("from Sub.bar")s=Sub()s.foo()#from parent.foo
#from parent.bar
print(Parent.__dict__) #看Parent的所以含义
#{‘__module__‘: ‘__main__‘, ‘_Parent__x‘: 1, ‘foo‘: <function Parent.foo at 0x101448598>, ‘_Parent__bar‘: <function Parent.__bar at 0x1014486a8>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Parent‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Parent‘ objects>, ‘__doc__‘: None}
class Foo1: #父类名改变 def test(self): print("from foo.test")class Bar(Foo1): #子类名改变,不需要改子类的test函数 def test(self): #Foo.test(self) 相对于如下 super(Bar,self).test() #使用super,父类改变 子类只需要改变类调用 不需要子类改函数 print("bar222")a=Bar()a.test()#from foo.test #bar222staticmethod+classmethod实例 setting.py文件
host="192.168.1.1"port=3004
import settingimport uuidclass Mysql: def __init__(self,host,port): self.host=host self.port=port self.id=self.create_id() @classmethod #绑定方法,绑定给class类 def from_conf(cls): #cls=Mysql() return cls(setting.host) #setting是模块,setting.host中host是模块变量 def func(self): #绑定给object对象 pass @staticmethod #非绑定方法,变成普通函数,不绑定给类或对象 def create_id(): return str(uuid.uuid1())conn_one=Mysql("1.1.1.1",3306)conn_tow=Mysql.from_conf()print(conn_one.host)print(conn_tow.host)#1.1.1.1#192.168.1.1print(Mysql.from_conf) #这是显示绑定类#<bound method Mysql.from_conf of <class ‘__main__.Mysql‘>>print(Mysql.func) #这是显示绑定对象#<function Mysql.func at 0x101c287b8>print(conn_one.id) #这是显示非绑定方法#5da84770-81dc-11e7-9569-48bf6be5ec1a#定义好数值,外部传参 可修改数值class People: def __init__(self,name,weight,height): self.name=name self.weight=weight self.height=height @property #类似装饰器,装饰下边 def bmi(self): return self.weight / (self.height ** 2)p=People("egon",75,1.80)p.height=1.84 #外部可改传参print(p.bmi)#22.152646502835537class People: def __init__(self,name,permmission=False): #permmission=False 定义默认值 用于增加权限 self.name=name self.permmission=permmission @property #继承 def name(self): return self.__name @name.setter #装饰器增加增加功能 def name(self,value): if not isinstance(value,str): raise TypeError("名字必须是字符串类型") self.__name=value @name.deleter #装饰器增加删除功能 def name(self): if not self.permmission: #permminsion值为False #这样写permmission值必须为True 加not为False, 而设置是permminsion值就是False raise PermissionError("不允许的操作") del self.__namep=People("egon")p.permmission=Truedel p.name
class People: def __init__(self,name,permmission=False): self.name=name self.permmission=permmission def get_name(self): return self.__name def set_name(self,value): if not isinstance(value,str): raise TypeError("名字必须是字符串类型") self.__name=value def del_name(self): if not self.permmission: raise PermissionError("不允许的操作") del self.__name name=property(get_name,set_name,del_name)p=People("egon")


#Foo是类#self是对象自己class Foo: count=0 def __init__(self,x,y,z): self.x=x self.y=y self.z=z def aa(self): Foo.count+=1 return Foo.countobj1=Foo("guolm",18,"linux")obj2=Foo("wy",28,"linux")obj3=Foo("haha",38,"yw")print(obj1.aa())print(obj2.aa())print(obj3.aa())print(obj3.aa())# 1# 2# 3# 4标签:attr 活性 同名 sel uuid read 返回 index host
原文地址:http://www.cnblogs.com/Gavinkwok/p/7387998.html