|
面向对象编程(OOP)一.类与实例1.类:是对现实世界描述的一种类型,是抽象的,是实例的模板,类名采用大驼峰,定义方式为`class类名:pass 。2.实例:根据类创建的具体对象,通过类名加括号(类名())创建。实例是具体的,内容依赖于类。3.self在类的方法中,self 代表调用该方法的实例本身,在类内来代表未来的实例。通过 self 可以访问实例的属性和其他方法。二.初始化函数 __init__这是类的特殊方法,通过初始化self 来初始化未来的实例,向self中添加数据就是向实例中添加数据。运行结果:三.魔法函数(特殊方法)这些方法允许对象进行特定的操作,如字符串表示(__str__)、长度计算(__len__)、比较(__eq__, __ne__ 等)和算术运算(__add__, __sub__ 等)。classMyClass:def__init__(self,name,age):print(f"初始化函数执行了")self.name=nameself.age=agedef__str__(self):returnf"醒醒了:{self.name}"def__len__(self):returnlen(self.name)def__eq__(self,other):returnself.age==other.agedef__ne__(self,other):returnself.age!=other.agedef__gt__(self,other):returnself.age>other.agedef__ge__(self,other):returnself.age>=other.agedef__lt__(self,other):returnself.agemc2,mc>=mc2,mc18#静态方法,判断是否成年def__init__(self,name,age):self.name=name#实例属性,姓名self.age=age#实例属性,年龄def__str__(self):returnf"名字:{self.name},年龄:{self.age}"#返回对象描述的字符串defset_name(self,name):self.name=name#设置姓名的实例方法defget_name(self):returnself.name#获取姓名的实例方法#创建一个Person对象p0=Person("张飞",20)#输出对象的name和age属性print(p0.name,p0.age)#输出:张飞20#使用__str__方法打印对象的字符串表示print(p0)#输出:名字:张飞,年龄:20#使用set_name方法修改name属性p0.set_name("关羽")#再次打印对象的字符串表示和获取名字print(p0,p0.get_name())#输出:名字:关羽,年龄:20#访问类属性print(Person.MAX_ACE)#输出:100print(Person.MIN_ACE)#输出:0#修改类属性Person.MIN_ACE=10print(Person.MIN_ACE)#输出:10#通过实例访问类属性(不推荐这样做)print(p0.MIN_ACE,p0.MAX_ACE)#输出:10100#尝试通过实例修改类属性(这不会修改类的属性,而是创建了一个实例属性)p0.MAX_ACE=200print(Person.MIN_ACE,p0.MAX_ACE)#输出:10200#使用类方法创建Person对象p2=Person.from_birth_year("关羽",1990)print(p2)#输出:名字:关羽,年龄:34#使用静态方法判断年龄是否成年print(Person.is_adult(20))#输出:Trueprint(Person.is_adult(15))#输出:False八.动态添加内容Python的动态性允许在运行时向类中添加新的属性、方法等。importtypesclassPerson:pass##在实例上添加属性向实例中添加实例数据其他实例无影响p0=Person()p=Person()p.name="赵云"print(p.name)#添加实例方法#向实例中添加实例数据其他实例无影响defmy_set_name(self,name):self.name=namep.set_name=types.MethodType(my_set_name,p)p.set_name("关羽")print(p.name)#向类中添加类属性类可以正常访问所有实例均可访问Person.MAX_AGE=120print(Person.MAX_AGE,p.MAX_AGE,p0.MAX_AGE)@classmethoddefmy_info(cls):print(cls.__bases__)#向类中添加类方法方法格式符合类方法格式类与所有实例均可访问Person.info=my_infoPerson.info()p0.info()p.info()@staticmethoddefmy_max(x,y):returnxifx>yelsey#向类中添加静态方法方法要符合静态方法格式类与实例均可访问Person.max=my_maxprint(Person.max(10,20),p.max(50,100),p0.max(200,500))九.数据的访问级别公有:普通名字,类内、类外、子类都可以使用。。私有:以双下划线 __ 开头的属性或方法,在类外部不能直接访问,但可以通过类的公有方法间接访问。保护(Python中不严格区分):以单下划线 _ 开头的属性或方法,遵在类内可以访问,在子类可以访问,在类外可强制访问。"""数据的访问级别 公有类型 public 普通名字 类内和类外,子类都可以使用 私有类型 private 以__开头 只能在类内访问 保护类型 protect 在类内可以访问 在子类中可以访问 在类外可以强制访问"""classPerson:def__init__(self,name,age,sex):self.name=nameself.__age=ageself._sex=sexdef_set_sex(self,sex):self._sex=sexdef_get_sex(self):returnself._sexdef__set_age(self,age):self.__age=agedef__get_age(self):returnself.__agedefget_name(self):returnself.namedefset_name(self,name):self.name=namedef__str__(self):returnf"name:{self.name},age:{self.__age},sex:{self._sex}"#公有p0=Person("张飞",20,"男")#私有只能在类内访问ageprint(p0)p0.set_name("张菲菲")print(p0.name,p0.get_name())#保护p0._set_sex("女")print(p0._get_sex())十.属性封装与 property口头称呼:类封装数据与操作,属性与行为,包括类属性、实例属性、公有属性、私有属性、保护属性。property :包括 fget(获取触发,@property)和 fset(设置触发,@属性名.setter)装饰器。classPerson:def__init__(self,name,age,sex,height):self.__name=nameself.age=ageself.__sex=sexself.__height=height@propertydefheight(self):returnself.__height@height.setterdefheight(self,height):self.__height=heightdef__get_sex(self):returnself.__sexdef__set_sex(self,sex):ifsexin["男","女"]:self.__sex=sexelse:print("设置失败")#封装真正的属性sex=property(__get_sex,__set_sex)defget_name(self):returnself.__namedefset_name(self,name):if2
|
|