定义一个学生类,用来形容学生html
# 定义一个空的类 class Student(): # 一个空类,pass表明直接跳过 # 此处pass必须有 pass # 定义一个对象 mingyue = Student() #在定义一个类,用来描述听Python的学生 class PythonStudent(): # 用None给不肯定的值赋值 name = None age = 18 course = "Python" # 须要注意 # 1.def doHomework的缩进层级 # 2.系统默认由一个self参数 def doHomework(self): print("I 在作做业") # 推荐在函数末尾使用return语句 return None # 实例化一个叫yueyue的学生,是一个具体的人 yueyue = PythonStudent() print(yueyue.name) print(yueyue.age) # 注意成员函数的调用没有传递进入参数 yueyue.doHomework()
- 案例 02.py
class A(): name = 'jjc' age = 18 for k,v in A.__dict__.items(): print(k,"--",v)
实例化类python
变量 = 类名() # 实例化了一个对象
obj.成员属性名称 obj.成员方法
dict先后各有两个下划线 obj.__dict__
class_name.__dict__
- anaconda主要是一个虚拟环境管理器 - 仍是一个安装包管理器 - conda list:显示anaconda安装的包 - conda env list:显示anconda的虚拟环境列表 - conda create -n xxx python=3.6:建立python版本为3.6的虚拟环境,名称为xxx
class Person(): # name是共有的成员 name = 'jjc' # __age就是私有成员 __age = 18 p = Person() print(p._Person__age)
# 继承的语法 # 在python中,任何类都有一个共同的父类叫object class Person(): name = 'NoName' age = 0 def sleep(self): print('Sleeping') # 父类写在括号内 class Teacher(Person): pass t = Teacher() t.sleep() print(t.name)
# 继承的语法 # 在python中,任何类都有一个共同的父类叫object # 子类和父类定义同一个名称变量,则优先使用子类自己 class Person(): name = 'NoName' age = 18 __score = 0 # 考试成绩是秘密,只有本身知道 _petname = "sec" # 小名,保护的,子类能够用,但不公用 def sleep(self): print('Sleeping') def work(self): print('make some money') # 父类写在括号内 class Teacher(Person): teacher_id = '9527' name = 'jjc' def make_test(self): print('attention') def work(self): # 扩充父类的功能只须要调用父类相应的函数 # Person.work(self) # 另外一种方法,super表明父类 Person.work(self) super().work() self.make_test() t = Teacher() t.work()
# 构造函数的概念 # 继承中的构造函数 class Animal(): def __init__(self): print('Dong wu') class PaxingAni(Animal): def __init__(self,name): print('Paxing Dongwu {0}'.format(name)) class Dog(PaxingAni): # __init__就是构造函数 # 每次实例化的时候,第一个被调用 # 由于主要工做是进行初始化,因此得名 def __init__(self): print("I'm init in dog") # 实例化的时候,括号内的参数须要跟构造函数参数匹配 # 由于找到了构造函数,则再也不查找父类的构造函数 kaka = Dog() # 实例化Dog时,查找到Dog的构造函数,参数匹配,不报错 # 猫没有写构造函数 class Cat(PaxingAni): pass # 此时Cat没有构造函数,则向上查找 # 由于PaxingAni的构造函数须要两个参数,实例化的时候给了一个,报错 c = Cat('jjc')
# 菱形继承 class A(): pass class B(A): pass class C(A): pass class D(B,C): pass
[多态及多态性[(https://www.cnblogs.com/luchuangao/p/6739557.html)算法
class A(): name = 'Jjc' class B(A): pass class C(): pass #检测B是否为A的子类 print(issubclass(B,A)) print(issubclass(B,object)) # 返回True a=A() print(isinstance(a,A)) print(hasattr(a,'name'))
# 属性案例 # 建立Student类,描述学生类 # 学生具备Student.name属性 # 但 named格式不统一 class Student(): def __init__(self,name,age): self.name = name self.age = age #self.setName(name) def intro(self): print('Hi, my name is {0}'.format(self.name.upper())) def setName(self,name): self.name = name.title() s1 = Student('jJC',19) s2 = Student('wcx',18.0) s1.intro() s2.intro()
# property案例 class A(): def __init__(self): self._name = 'haha' self._age = 18 # 此功能,是对类变量进行读取操做的时候应该执行的函数功能 def fget(self): print("{0}被读取了".format(self._name)) return self._name # 模拟的是对变量进行写操做的时候执行的功能 def fset(self, val): print("{0}我被写入了,可是还能够作好多事情".format(val)) self._name = '我是' + val # fdel模拟的是删除变量的时候进行的操做 def fdel(self): del self._name name = property(fget, fset, fdel, "这是一个property的例子") a = A() a.name = "jjc" print(a.name)
#上面的代码等价于下面的代码 class A(object): @property def name(self): print("{0}被读取了".format(self._name)) return self._name @name.setter def name(self,val): print("{0}我被写入了,可是还能够作好多事情".format(val)) self._name = '我是' + val @name.deleter def name(self): del self._name a = A() a.name = "jjc" print(a.name)
- __dict__:以字典的方式显示类的成员组成 - __doc__:获取类的文档信息 - __name__:获取类的名称,若是在模块中使用,获取模块的名称 - __bases__:获取某个类的全部父类,以元组的方式显示
# __init__ 举例 class A(): def __init__(self,name = 0): print("sa") # __call__举例 def __call__(self): print("我被举报了") def __str__(self): return 'bu' a = A() a() print(a)
class A(): def __getattr__(self,name): print('没找到') print(name) a = A() print(a.name) print(a.addr)
# __setattr__案例 class Person(): def __init__(self): pass def __setattr__(self, name, value): print('设置属性:{0}'.format(name)) # 下面语句会致使问题,死循环 #self.name = value # 此种状况,为了不死循环,规定统一调用父类魔法函数 super().__setattr__(name,value) p = Person() print(p.__dict__) p.age = 18
# __get__ class Student(): def __init__(self,name): self._name = name def __gt__(self,obj): print("haha, {0}会比{1}大吗?".format(self._name,obj._name)) return self._name > obj._name # 字符串的比较是按什么规则 stu1 = Student('one') stu2 = Student('two') print(stu1 > stu2) # 问,如何让显示结果美观,one 会比 twi大吗
# 三种方法案例 class Person: # 实例方法 def eat(self): print(self) print('Eating……') # 类方法 # 类方法的第一个参数,通常命名为cls,区别于self @classmethod def play(cls): print(cls) print('Playing……') # 静态方法 # 不须要用第一个参数表示自身或者类 @staticmethod def say(): print('Saying……') yueyue = Person() #实例方法 yueyue.eat() # 类方法 Person.play() yueyue.play() # 静态方法 Person.say() yueyue.say()
# 抽象类的实现 import abc # 申明一个类而且制定当前类的元类 class Human(metaclass = abc.ABCMeta): # 定义一个抽象的方法 @abc.abstractmethod def smoking(self): pass # 定义类抽象方法 @abc.abctractclassmethod def drink(): pass # 定义静态抽象方法 @abc.abstractstaticmethod def play(): pass
# 本身组装一个类 # 若是要绑定对象,用下面一句代码,绑定类,不须要 from types import MethodType class A(): pass def say(self): print("saying……") a = A() a.tt = MethodType(say,A) a.tt()
# 利用type造一个类 # 先定义类应该具备的成员函数 def say(self): print("saying……") def talk(self): print("Talking……") # 用type来建立一个类 A = type("AName",(object,),{"class_say":say, "class_talk":talk}) # 而后能够像正常访问同样使用类 a = A() a.class_say() a.class_talk()
# 元类演示 # 元类写法是固定的,必须继承自type # 元类通常命名以MetaClass结尾 class TulingMetaClass(type): # 注意一下写法 def __new__(cls, name, bases, attrs): # 本身的业务处理 print("我是元类") attrs['id'] = '000000' attrs['addr'] = "苏州市" return type.__new__(cls, name, bases, attrs) # 元类定义完就可使用,使用注意写法 class Teacher(object, metaclass = TulingMetaClass): pass t = Teacher() t.id