怎么样用自己电脑做网站百度官方营销推广平台官网
- 作者: 五速梦信息网
- 时间: 2026年03月21日 06:48
当前位置: 首页 > news >正文
怎么样用自己电脑做网站,百度官方营销推广平台官网,深圳台历制作,贵阳响应式网站开发菜鸟教程《Python 3 教程》笔记#xff08;20#xff09; 20 面向对象20.1 面向对象技术简介20.2 创建类20.2.1 类定义20.2.2 实例化20.2.3 初始化20.2.4 类变量、实例变量20.2.5 类方法、实例方法、静态方法 20.3 访问可见性20.3.1 property装饰器 20.4 动态性20.4.1 __slot… 菜鸟教程《Python 3 教程》笔记20 20 面向对象20.1 面向对象技术简介20.2 创建类20.2.1 类定义20.2.2 实例化20.2.3 初始化20.2.4 类变量、实例变量20.2.5 类方法、实例方法、静态方法 20.3 访问可见性20.3.1 property装饰器 20.4 动态性20.4.1 slots魔法 20.5 继承20.5.1 多继承20.5.2 super() 函数 20.6 多态20.7 类的专有方法20.7.1 运算符重载 笔记带有个人侧重点不追求面面俱到。 20 面向对象 出处 菜鸟教程 - Python3 面向对象 参考内容 GtiHub - jackfrued: Python-100-Days/09.面向对象进阶知乎 - 泽霖: python类的实例方法、静态方法和类方法区别 20.1 面向对象技术简介 类(Class) 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法 类中定义的函数。类变量 类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。局部变量 定义在方法中的变量只作用于当前实例的类。实例变量 在类的声明中属性是用变量来表示的这种变量就称为实例变量实例变量就是一个用 self 修饰的变量。数据成员 类变量或者实例变量用于处理类及其实例对象的相关的数据。实例化 创建一个类的实例类的具体对象。对象 通过类定义的数据结构实例。对象包括两个数据成员类变量和实例变量和方法。继承 即一个派生类derived class继承基类base class的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如有这样一个设计一个Dog类型的对象派生自Animal类这是模拟是一个is-a关系例图Dog是一个Animal。方法重写 如果从父类继承的方法不能满足子类的需求可以对其进行改写这个过程叫方法的覆盖override也称为方法的重写。 20.2 创建类 20.2.1 类定义 使用 class 定义类。 class ClassName:statement-1…statement-N最好使用 class ClassName(object) 的形式定义类。 类的属性和方法 class ClassName(object):a 0def fuc():print(Hello)20.2.2 实例化 通过下述方法可以创建类实例。 obj Myclass()20.2.3 初始化 类有一个名为 init() 的特殊方法构造方法该方法在类实例化时会自动调用。 class Complex:def init(self, realpart, imagpart):self.r realpartself.i imagpart x Complex(3.0, -4.5) print(x.r, x.i) # 输出结果3.0 -4.5self代表类的实例而非类 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。 class Test:def prt(self):print(self)print(self.class)t Test() t.prt()执行结果 main.Test instance at 0x100771878 main.Test从执行结果可以很明显的看出self 代表的是类的实例代表当前对象的地址而 self.class 则指向类。 self 不是 python 关键字把它换成 runoob 也是可以正常执行的 class Test:def prt(runoob):print(runoob)print(runoob.class)t Test() t.prt()20.2.4 类变量、实例变量 class test(object):a cls # 类变量def init(self, num):some.b num # 实例变量print(test.a) obj test(10) print(obj.b) print(obj.a)20.2.5 类方法、实例方法、静态方法 一、创建 类方法第一个参数为 cls表示这个类本身包含当前类的相关信息。 实例方法第一个参数为 self表示实例本身包含实例对象的信息。 静态方法可以不用传入参数相当于把一个外部函数放在类中。 class test(object):a 类变量def init(self):self.b 实例变量classmethoddef cls_func(cls):print(这是一个类方法)def obj_func(self):print(这是一个实例方法)staticmethoddef func():print(这是一个静态方法)二、调用 类内调用 class Test(object):a 类变量def init(self):self.b 实例变量classmethoddef cls_func(cls):print(这是一个类方法)def obj_func(self):print(这是一个实例方法)staticmethoddef func():print(这是一个静态方法)# 类内调用classmethoddef cls_func1(cls):cls.cls_func()cls.func()obj cls()obj.obj_func()def obj_func1(self):self.cls_func()self.obj_func()self.func()staticmethoddef func1():Test.cls_func()obj Test()obj.obj_func()Test.func()对象调用 if name main:test.cls_func()test.func()obj test()obj.cls_func()obj.obj_func()obj.func()三、使用场景 类方法一般是整个类都会使用的操作不受实例化影响。 实例方法需要实例化用于涉及特定实例化对象的操作。 静态方法用于不涉及类信息的操作。 四、区别 子类的实例继承了父类的static_method静态方法调用该方法还是调用的父类的方法和类属性。 子类的实例继承了父类的class_method类方法调用该方法调用的是子类的方法和子类的类属性。 20.3 访问可见性 在 Python 中属性和方法的访问权限只有2种公开和私有。以2个下划线开头进行声明可以将属性和方法定义为私有。声明为私有后只能在类的内部调用 不能在类的外部调用。 class Test:def init(self, foo):self.__foo foodef bar(self):print(self.foo)print(__bar)def main():test Test(hello)# AttributeError: Test object has no attribute bartest.bar()# AttributeError: Test object has no attribute fooprint(test.foo)if name main:main()但是Python并没有从语法上严格保证私有属性或方法的私密性它只是给私有的属性和方法换了一个名字来妨碍对它们的访问事实上如果你知道更换名字的规则仍然可以访问到它们下面的代码就可以验证这一点。之所以这样设定可以用这样一句名言加以解释就是We are all consenting adults here。因为绝大多数程序员都认为开放比封闭要好而且程序员要自己为自己的行为负责。 class Test:def init(self, foo):self.__foo foodef bar(self):print(self.foo)print(bar)def main():test Test(hello)test._Testbar()print(test._Test__foo)if name main:main()在实际开发中并不建议将属性设置为私有的因为这会导致子类无法访问。所以大多数Python程序员会遵循一种命名惯例就是让属性名以单下划线开头来表示属性是受保护的本类之外的代码在访问这样的属性时应该要保持慎重。这种做法并不是语法上的规则单下划线开头的属性和方法外界仍然是可以访问的所以更多的时候它是一种暗示或隐喻。 20.3.1 property装饰器 在不将属性直接暴露给外界的情况下如果想访问属性可以通过属性的 getter访问器和 setter修改器方法进行对应的操作。如果要做到这点就可以考虑使用 property 包装器来包装 getter 和 setter 方法使得对属性的访问既安全又方便。 class Person(object):def init(self, name, age):self._name nameself._age age# 访问器 - getter方法propertydef name(self):return self._name# 访问器 - getter方法propertydef age(self):return self._age# 修改器 - setter方法age.setterdef age(self, age):self._age agedef play(self):if self._age 16:print(%s正在玩飞行棋. % self._name)else:print(%s正在玩斗地主. % self._name)def main():person Person(王大锤, 12)person.play()person.age 22person.play()# person.name 白元芳 # AttributeError: cant set attributeif name main:main()20.4 动态性 Python 是一门动态语言。通常动态语言允许我们在程序运行时给对象绑定新的属性或方法当然也可以对已经绑定的属性和方法进行解绑定。 import typesclass Pearson(object):def init(self, name, age):self._name nameself._age agedef is_adult(self):if self._age 18:return Trueelse:return Falsedef main():boy Pearson(小明, 16)boy._gender 男boy.is_adult types.MethodType(is_adult, boy)print(boy._gender)print(boy.is_adult())del boy.is_adultdelattr(boy, _gender)if name main:main()注意 del 和 delattr 功能有限都是针对实例对象而言的对于类方法类属性则删除不了。 更多内容可以参考CSDN - 涤生大数据Python语言的动态性运行时动态绑定删除属性和方法 20.4.1 slots魔法 如果需要限定自定义类型的对象只能绑定某些属性可以通过在类中定义 slots 变量来进行限定。需要注意的是 slots 的限定只对当前类的对象生效对子类并不起任何作用。 class Person(object):# 限定Person对象只能绑定_name, _age和_gender属性slots (_name, _age, _gender)def init(self, name, age):self._name nameself._age age20.5 继承 子类派生类 DerivedClassName会继承父类基类 BaseClassName的属性和方法 class DerivedClassName(BaseClassName):statement-1…statement-N基类定义在另一个模块中时可以使用 class DerivedClassName(modname.BaseClassName):子类除了继承父类提供的属性和方法还可以定义自己特有的属性和方法所以子类比父类拥有的更多的能力。 20.5.1 多继承 多继承的类定义形如下 class DerivedClassName(Base1, Base2, Base3):statement-1…statement-N需要注意圆括号中父类的顺序若是父类中有相同的方法名而在子类类中未找到时python会从左到右查找父类中是否包含方法。 class A(object):classmethoddef who(cls):print(A)class B(object):classmethoddef who(cls):print(B)class C(A, B):passdef main():C.who()print(C.mro) # 查看类的方法解析顺序if name main:main()更多内容可以参考朋疏哲NPython多继承实现以及问题应对策略 20.5.2 super() 函数 super() 函数是用于调用父类(超类)的一个方法。super() 是用来解决多重继承问题的直接用类名调用父类方法在使用单继承的时候没问题但是如果使用多继承会涉及到查找顺序MRO、重复调用钻石继承等种种问题。MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。 语法 super(type[, object-or-type])参数 type – 类。object-or-type – 类一般是 self。 实例 class FooParent(object):def init(self):self.parent I\m the parent.print (Parent)def bar(self, message):print (%s from Parent % message)class FooChild(FooParent):def init(self):super().init() print (Child)def bar(self, message):super().bar(message)print (Child bar fuction)print (self.parent)if name main:fooChild FooChild()fooChild.bar(HelloWorld)菱形继承 — B — A –| |– D— C —Python3 中继承遵循广度优先原则 class A:def init(self):print(Enter A)print(self)print(Leave A)class B(A):def init(self):print(Enter B)print(self)super(B, self).init()print(Leave B)class C(A):def init(self):print(Enter C)print(self)super(C, self).init()print(Leave C)class D(B, C):def init(self):print(Enter D)print(self)super(D, self).init()print(Leave D)d D()运行结果 Enter D main.D object at 0x7fdb02618490 Enter B main.D object at 0x7fdb02618490 Enter C main.D object at 0x7fdb02618490 Enter A main.D object at 0x7fdb02618490 Leave A Leave C Leave B Leave D20.6 多态 子类在继承了父类的方法后可以对父类已有的方法给出新的实现版本这个动作称之为方法重写override。通过方法重写我们可以让父类的同一个行为在子类中拥有不同的实现版本当我们调用这个经过子类重写的方法时不同的子类对象会表现出不同的行为这个就是多态poly-morphism。 class Parent: # 定义父类def myMethod(self):print (调用父类方法)class Child(Parent): # 定义子类def myMethod(self):print (调用子类方法)c Child() # 子类实例 c.myMethod() # 子类调用重写方法 super(Child, c).myMethod() # 用子类对象调用父类已被覆盖的方法20.7 类的专有方法 init构造函数在生成对象时调用del析构函数释放对象时使用repr打印转换setitem按照索引赋值getitem按照索引获取值len获得长度cmp比较运算call函数调用add加运算sub减运算mul乘运算truediv除运算mod求余运算pow乘方。 参考阅读 知乎 - 黄同学Python基础十九面向对象“类”之魔法方法 DataScienceDay12.魔法方法方法重写 20.7.1 运算符重载 #!/usr/bin/python3class Vector:def init(self, a, b):self.a aself.b bdef str(self):return Vector (%d, %d) % (self.a, self.b)def repr(self):return Vector (%d, %d) % (self.a, self.b)def add(self,other):if other.class is Vector:return Vector(self.a other.a, self.b other.b)elif other.class is int:return Vector(self.aother,self.b)def radd(self,other):反向算术运算符的重载add运算符重载可以保证Vint的情况下不会报错但是反过来intV就会报错通过反向运算符重载可以解决此问题if other.class is int or other.class is float:return Vector(self.aother,self.b)else:raise ValueError(值错误)def iadd(self,other):复合赋值算数运算符的重载主要用于列表例如L1L2,默认情况下调用add会生成一个新的列表当数据过大的时候会影响效率而此函数可以重载使L2直接增加到L1后面if other.class is Vector:return Vector(self.a other.a, self.b other.b)elif other.class is int:return Vector(self.aother,self.b) v1 Vector(2,10) v2 Vector(5,-2) print (v1 v2) print (v1 5) print (6 v2)
相关文章
-
怎么样用ppt做网站综合购物网站排名
怎么样用ppt做网站综合购物网站排名
- 技术栈
- 2026年03月21日
-
怎么样销售关于网站建设教怎么做ppt的网站
怎么样销售关于网站建设教怎么做ppt的网站
- 技术栈
- 2026年03月21日
-
怎么样网站泛解析导购网站 转化率
怎么样网站泛解析导购网站 转化率
- 技术栈
- 2026年03月21日
-
怎么样在网站文章最后做超链接腾讯企业邮箱登录入口免费版
怎么样在网站文章最后做超链接腾讯企业邮箱登录入口免费版
- 技术栈
- 2026年03月21日
-
怎么样自己开网站能够做代理的网站有哪些问题
怎么样自己开网站能够做代理的网站有哪些问题
- 技术栈
- 2026年03月21日
-
怎么样做美术招生信息网站自己做网站出证书
怎么样做美术招生信息网站自己做网站出证书
- 技术栈
- 2026年03月21日
