def clae(opt):if opt == '+':return lambda a, b :(a + b) elif opt == '-':return lambda a ,b : (a - b)elif opt == '/':return lambda a , b :(a / b)elif opt == '*':return lambda a ,b :(a * b)else:return 'nofund function model selection true again'
f1 = clae('+')
f2 = clae('-')
print(format(f2(2,3)))
这是一个计算器的简单设置
#face to object
#用面对对象的思想去做这个函数的思想方式,如何用类的对象进行函数分析
class Car:#类是对象的模板,创建出很多的模板出def __init__(self,name,age):self.name = nameself.age = ageprint('这是init的函数区域')passdef __str__(self):return '%s 就是 %s'%(self.name,self.age) #这个是当你创建一个实例对象之后,会生成的一范例passdef __new__(cls,*args,**kwargs): #在这里真正创建对象实例的print('这是new的函数区域')return object.__new__(cls)passpass
car = Car("faf",2)
print(car)
#__new__ AND __init__区别,new是类的实例化方法,有return返回该实例,否则对象就创建不成功
#__init__用来做数据属性的初始化工作,也可以认为是实例的构造方法,接受类的实例,通过self对其进行构造
#__new__函数执行要早于init函数
__init__这些都是魔术方法,__str__ 就是创建实例变量就会现实这个内容。
结果是,先从调用new的内容,然后再初始化属性。但是不加new也是可以的。
这是new的函数区域 这是init的函数区域 faf 就是 2
初始化内容,init里面存在有多种信息,可以直接存在列表里面,列表里面的每一个框都是一个实例。
class Dogs:def __init__(self,name,age,sex='male'):self.name = nameself.age = ageself.sex = sex
d1 = Dogs('qiu',1)
d2 = Dogs('fag',2)
d3 = Dogs(name='hfsdh',sex='female',age=2)
dog_number =[d1,d2,d3]
还有可以创建cat 的类。创建内容不用传入所有的属性,比如,我创建cat,还可以设置一个speak的方法,加入属性noise,不过可以加入信息。
class Cat:def __init__(self,name,age,sex='female'):self.name = nameself.age = ageself.sex = sexdef run(self):print('{0} is running '.format(self.name))def speak(self,noise):print('{0} is make noise {1}'.format(self.name,noise))def clas(self):print('{0} is a {1} cat'.format(self.name,self.sex))
cat = Cat('fafa',2)
cat.run()
cat.speak('jweguiwyeuhtgwhg')
经过使用del方法,def __del__可以直接删除当前内存里面的内容。
class Animal:def __init__(self,name):self.name = name passdef __str__(self):return ("这是构造初始化的方法")def __del__(self):print('这是一个构造方法')print('当程序后面没有调用该类的时候,自动调用该函数,释放空间')print('对象呗手动删除也会调用这个函数,释放完毕对象将不能再使用')pass
cat = Animal('小花猫')
print(cat)
del cat #手动清理删除对象,会执行del函数
print(cat)
下面的print(cat)就无法显示实例。
私有属性:
#通过property的属性调用私有化的方法
class Person(object):def __init__(self): self.__age = "34" #定义一个私有化属性 def get_age(self):return self.__agedef set_age(self,age):if age < 0:print('年龄不能小于0 ')else:self.__age = agepasspassage = property(get_age,set_age)age1 = property(get_age,set_age) #pass
p1 = Person()
print(p1.age)
p1.age = 25
print(p1.age)
print(p1.age1)
class Account:interest_rate = 0.0568 #类变量def __init__(self,owner,amount):self.owner = ownerself.amount = amount#类方法@classmethod def interest_by(cls,amt):return cls.interest_rate * amtaccount = Account('Tony ',80000.0)
Account.interest_rate
print('{0}'.format(Account.interest_rate)) #调用类变量要直接调用类名才可以,这样调用个体实例的方法来调用interest = Account.interest_by(120000.0)
#print('account :{0:.4f}'.format(interest))
#使用属性
class Dog:def __init__(self,name,age,sex='female'):self.name = nameself.__age = age #私有变量#实例方法def run(self):print('{0} is running '.format(self.name))#get 方法@property #用装饰器添加属性装饰。提供一个getter的方法def age(self): #替代 get_age 只读类型的return self.__age@age.setter #s提供一个set的方法def age(self,age): #替代set_age(self,age) ,这是给私有程序变量赋值self.__age = age
dog = Dog('qiuqiu',2)
print('gougou nianling n{0}'.format(dog.age))
dog.age = 3 #dog.set_age(3)
print('gougou nianling n{0}'.format(dog.age))
class DataBaseClass(object):def __new__(cls, *args, **kwargs):#cls._instance = cls.__new__(cls) 不能使用自身的new方法,容易造成深度递归if not hasattr(cls,'_instance'):cls._instance = super().__new__(cls, *args, **kwargs)return cls._instancepassclass DBoptSingle(DataBaseClass):pass
db1 = DBoptSingle()
print(id(db1))
db2 = DBoptSingle()
print(id(db2))
db3 = DBoptSingle()
print(id(db3))
class People:country = 'China'@classmethoddef get_country(cls):untrypass@classmethoddef change_country(cls,data):untry = datapass
_country()) #累对象可以调用类属性,在静态方法中不会涉及到
p = People()
_country()) #实例对象也可以修改
People.change_country('Indian')
_country())
#dewmo 返回当前的时间
class Time:def __init__(self,hour,miniter,second):self.hour = hourself.miniter = miniterself.second = second@staticmethoddef showtime():return time.strftime('%H:%M:%S',time.localtime())pass
print(Time.showtime())
T = Time(4,52,6)
print(T.showtime())
#继承的方法
class Animal: #这是可以定义为一个父类def __init__(self,name):self.name = name def show_info(self):return 'anmial name is {0}'.format(self.name)def move(self):print('dongyidong')
class Cat(Animal): #在类的后面加上括号def __init__(self,name,age):super().__init__(name) #super()调用父类的方法self.age = age #实例变量age
cat = Cat("Tom",2)
ve() #可以调用父类的行为,继承父类的感觉
print(cat.show_info())
#子类独有的实现,互不干扰
class Baseline(object):def test(self):print('___________base line___________')pass
class Base(object):def test(self):print('-------base ---------------')
class A(Baseline):def test(self):print("a in")pass
class B(Baseline):def test(self):print("b in")pass
class A1(Base):def test(self):print("a in base")pass
class B1(Base):def test(self):print("b in base")pass
class C(A1,B1):# def test(self):# print("c in")pass
class D(A,B):def test(self):print("d in")pass
class E(C,D):# def test(self):#print("e in")pass
class F(C,D):def test(self):print("f in")passe = E()
st())
print(E.__mro__)
#多继承的规则
class Hours:def __init__(self,name):self.name = namedef show_info(self):return "the name {0} of hours".format(self.name)def run(self):print('the hourse is running again')
class Donkey:def __init__(self,name):self.name = name # self.age = agedef roll(self):print('驴打滚')def show_info(self):return 'donkey name {0} is '.format(self.name)def run(self):print('donkey is running{0}'.format(self.name))
#class Mule(Hours,Donkey):
class Mule(Hours, Donkey): #z这里的左右就是优先级,都存在相同方法的时候
#查找方法顺序的问题,顺序应该是查找方法的顺序应该是在a中查找,如果a中没有, 再去b类中查找A(b,c),然后再去同级的c类中查找def __init__(self,name,age1):self.age1 = age1super().__init__(name) #这个是自动找父类,然后调用方法#Hourse.__init__(self,name )#如果父类有的要继承,没有的需要自己加上def age(self):print('{0}faagagagag'.format(self.age1))def run(self): #因为父类中已经存在这类的方法,相当于方法覆盖啦已经print('paode kuai ')
m = Mule('faagag',23)
m.run()
m.roll()
m.age()
print(m.show_info()) #如果是都有优先从上往下
#这里还有是有一些问题需要解答,关于如何将自己的数据选好,用更多的堕属性去赋值
class eat:def eatway(self):print('eat')pass
class GrandFather(eat):def eat1(self):print('chi de fangfa')passpass
class Father(GrandFather):print("fag")pass
class Son(Father):print('son eat')pass
son = Son()
print(son.eatway())
#多态,有多种形式的表达方法,可以增加程序的灵活性,增加程序的扩展性两个特性,duck typing you'qi'lai
class Animal:def speak(obj):print('动物叫')def running(self):print("running animal")
class Dog(Animal):def speak(self):print('小狗开始叫啦')def running(self):print('dog is running ')
class Cat(Animal):def speak(self):print('小猫开始叫啦')def running(self):print('cat is running ')
class Car:def speak(self):print("小汽车开始叫啦")def running(self):print('car is running ')
def star(obj):obj.speak()
def Invoke(objket):objket.running()
star(Car())
star(Dog())
star(Cat()) #意思是不调用父类也能调用这个方法
#循环 调用是speak函数
listObj = [Cat(),Dog(),Car()]
for item in listObj:Invoke(item)
#多种异常的处理方法
#将多种值的异常现象进行改变, 吧某些异常合并到一个except的字符串
#自定义异常
#codintg= utf -8
class ZhijieketangException(Exception): #首先寻找错误需要先在这里填入Exceptiondef __init__(self,message):super().__init__(message)def __str__(self):return 'the string about you print is too long pass by'pass
i= input('请输入数字:')
num = 8888
try:i2 = int(i)try:result = num / i2print('{0}除以{1}等于{2}'.format(num,i2,result))except ZeroDivisionError as e1:print('不能除以0,异常 n{}'.format(e1))# raise ZhijieketangException('不能除以0')
except ValueError as e2:print('输入的数字无效,异常 n{}'.format(e2))# raise ZhijieketangException('输入的值有误')
#对于变量再说,怎么进行动态绑定,这个需要好好学一下
class Student:def __init__(self,name,age):self.name = name self.age = agepassdef __str__(self):return '%s 今年 %s 岁啦'%(self.name,self.age)passzlh= Student('张刘华',23)
zlh.weight = 80 #等于我这里给zlh实例赋值一个体重变量是80
print(zlh.weight)
zm = Student('张敏',22)
Student.school = '北京理工大学' #直接给类添加一个属性值,其他的调用变量就都可以使用这个属性 zm.school = #以下可以动态添加方法
import types #添加方法的库
def dymicMethod(self):print('{} 体重是{} 在{} 读书'.format(self.name,self.weight,Student.school)) #这就是在外部添加一个方法
zlh.printInfo= types.MethodType(dymicMethod,zlh)
zlh.printInfo()
本文发布于:2024-01-29 07:26:40,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170648440513669.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |