持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
定义类
==注意,若类的方法与属性名一样。则属性会覆盖方法==
一个类可以产生无数的对象,当对象的方法被调用时候,对象会将自身作为第一个参数作为self参数传给方法,这样子就可以分辨是哪一个变量在调用这个方法,所以定义方法时候第一个参数必定是self 关于self 不理解也没关系,每一个函数都放在第一个函数即可
__ init __(self) 是魔法方法用于传参数,使用方法如下 在类实例化开始时会自动被调用,可以用于一些开始时候需要做的事 用了__init__可以直接在生成对象时候传参数 但是注意__init__不能返回数据,它默认放回None
关于魔法方法后期文章解释
def aa():
print('dd')
class aa :
“这是类的说明” # 用类名.__doc__ 可以输出
g = 3
def jj(self):
aa() #可以调用全局函数
print(‘jjjjj’)
class bb:
#属性,,,,,,就是变量的值,,,比如鱼是红色的,多大,这些是属性
a= 1
b = ‘sssss’ #这是类属性,所有实例共有的,只要一个实例修改了它,全部实例都改变
#方法 就是类内的函数
def sename(self,name):
self.name = nema #如self.xxxx是实例属性,每个实例互不影响
def pr(self)
print(self.name)
def hhh(self):
pass
class cc:
def __init__(self,name)
self.name = name
self.pr #可以调用下面的函数
def pr(self)
print (self.name)
使用
实例名.__dict__可以查看实例的属性(字典类型) 类名.__dict__可以查看类的属性(字典类型)
以上定义中aa为类,a为实例对象 还可以直接使用类对象 如aa.g 这是类对象
为了区分函数与类 约定类大写开头,函数小写开头
如实例对象
a = aa()
a.jj()
#结果为 jjjjj
a = bb()
a.setname(‘gfx’)
a.pr()
#结果为gfx
#如cc中使用了__init__可以直接在生成对象时候传参数
a = cc(‘gfx’)
a. pr()
#结果为gfx
#实例对象可以直接加属性
#如a.hh = 8 相当于加一个hh属性
#实例对象使用时可以修改属性的值
#a.g +=3
#则a.g 结果为6
使用类对象
如
a = aa()
b = aa()
c = aa()
#a,b,c是不同的实例对象
#如a.g 结果为3
b.g 结果为3
a.g +=3
#则a.g 结果为6
b.g 结果为3
#但若使用类对象,会直接改变类的属性
aa.g = 8
#则a.g 结果为8
b.g 结果为8
访问属性 如 a.g 可以访问 也可以 用getattr(实例对象名,‘属性名’,‘若无此属性返回内容’)
==但是方法只有实例对象才能调用,这个也是python的绑定概念==
==定义了实例对象,再删除该类,这个实例对象也是可以用的,==
私有定义
由双下划线开头的为私有定义 __ a ==不可被外部调用,只能内部== 如
class dd:
__a = 4
def get(self)
return __a
#使用
g =dd
g.__a #不合法
外部使用私有变量 假如要在外部用a,需要借助方法get g.get() 即可
实际上python的私有是一种 ‘假私有’(名字重整) 这是改变了变量名字 改为 __类名__变量名 所以g.__dd__a也可以在外部调用
继承操作:
class 类1名(类2名): 继承操作:类1继承类2的方法和属性
==不能继承私有方法和属性== 继承是有顺序的,从左往右,若有同名方法或属性,先继承前面的,后面的被屏蔽
如果子类中还定义与父类同名的方法或属性,则自动覆盖父类的对应的方法或属性
注意子类中再用__init__可能会覆盖父类中的需要的变量 解决方法有两个 一. 调用未绑定的父类方法 如 定义子类时 父类名.__ init __(self)即可 二. 使用super函数 用法在子类中 super().父类中需要的方法名()
如 super().__ init __() 可以自动找父类,以后也不用修改
可以多重继承,class 类1名(父类1名,父类3名,父类四名……): 如class ff (aa,cc,dd):
组合
即多个对象的组合、 就是把类的实例化放到另一个组合里 如
class a :
def __init__(self,x)
self.num = x
class c :
def __init__(self,y)
self.num = y
class d :
def __init__(self,x,y)
self.a = a(x)
self.c = c(y)
def pr(self)
print(‘a有%d个,c有%d个‘%(self.a.num , self.c.num)
结果为
g = d (3,4)
A有3个,c有4个
相关的BIF(内置函数)
-
issubclass(class,classinfo) 若第一个参数class 是第二个参数的子类或者本身返回true 否则返回false 第二个参数可以是一个元组,里面有各个类,只有其中一个是第一个的父类即符合条件 如issubclass(class,object) 返回true,,,,object是所有类的一个基类,所有类默认继承object
-
isinstance(实例对象名,classinfo) 检擦实例对象是否属于第二个参数类,是则返回true 否则则反之 第二个参数可以是一个元组,里面有各个类,只有其中一个即可 如果第一个参数不是传入对象,一直返回false
-
hasattr(对象名,name) 若对象里面有第二个参数这个属性,有则true,name是一个字符串有‘‘ 或“”
-
getattr(对象名,name [, default]) 返回对象指定属性的值,若指定属性不存在将[, default的值打印出来,若不输入[, default]则返回异常
-
s etattr(对象名,name ,value) 设定对象中指定属性的值,若属性不存在则新建一个属性并赋值
-
delattr(对象名,name) 删除对象的指定属性,若属性不存在则异常
-
Property (fget = None, fset =None ,fdel = None,doc = None) 去设置一个存在的属性 Fget,是获取属性的方法 Fset设置属性的方法 Fdel删除属性的方法 但是具体方法要自己传入 使用
class q:
def __init__(self,size=10):
self.size = size
def get(self):
return Self.size
def set(self,value):
self.size = value
def dellll ():
del self.size
x = property (get, set,dellll)
则
设置size
q.x = 78
使用size
q.x
删除size
del q.x
最后
持续更新arduino 树莓派 python linux c语言等等 接到有帮助的话 求点赞👍 求关注❤️ 求分享👥 有问题可以评论 点关注,不迷路 如果有任何错误,如何建议,请批评指教,不胜感激 !