• Python入门 面向对象


    简单Try

    class Student(object):
    	def __init__(self, name, score):
    		self.name=name
    		self.score = score
    
    	def print_score(self):
    		print("%s %s" %(self.name, self.score))
    
    
    dd = Student('draymonder', 21)
    bb = Student('bing', 21)
    
    dd.print_score()
    

    访问限制

    如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问

    实际上是可以访问的,只是_规范程序员以私有变量来使用
    具体访问如下

    class Student(object):
    	def __init__(self, name, score):
    		self.__name=name
    		self.__score = score
    
    	def print_score(self):
    		print("%s %s" %(self.__name, self.__score))
    
    
    dd = Student('draymonder', 21)
    print(dd._Student__name)
    

    print(dd._Student__name)

    @property

    内置的@property装饰器就是负责把一个方法变成属性调用的

    class Student(object):
    
    	@property
    	def birth(self):
    		return self._birth
    	
    	@birth.setter
    	def birth(self, vale):
    		self._birth = value
    
    	@property
    	def age(self):
    		return 2019 - self._birth
    
    s = Student()
    s._birth = 1998
    print(s.age)
    

    getattr

    class Chain(object):
    
        def __init__(self, path=''):
            self._path = path
    
        def __getattr__(self, path):
            return Chain('%s/%s' % (self._path, path))
    
        def __str__(self):
            return self._path
    
        __repr__ = __str__
    
    print(Chain().status.user.timeline.list)
    

    使用元类

    创建类

    def fn(self, name="world"):
    	print("hello %s" %name)
    
    Hello = type("hello", (object,), dict(hello=fn)) #创建hello class
    

    list添加add方法

    class ListMetaclass(type):
    	def __new__(cls, name, bases, attrs):
    		attrs['add'] = lambda self,value: self.append(value)
    		return type.__new__(cls, name, bases, attrs)
    
    class MyList(list, metaclass = ListMetaclass):
    	pass
    
    L = MyList()
    L.add(1)
    L.add(2)
    L.add(3)
    print(L)
    

    简易ORM模型

    class ModelMetaclass(type):
        def __new__(cls, name, bases, attrs):
            if name=='Model':
                return type.__new__(cls, name, bases, attrs)
            print('Found model: %s' % name)
            mappings = dict()
            for k, v in attrs.items():
                if isinstance(v, Field):
                    print('Found mapping: %s ==> %s' % (k, v))
                    mappings[k] = v
            for k in mappings.keys():
                attrs.pop(k)
            attrs['__mappings__'] = mappings # 保存属性和列的映射关系
            attrs['__table__'] = name # 假设表名和类名一致
            return type.__new__(cls, name, bases, attrs)
    
    
    class Model(dict, metaclass=ModelMetaclass):
        def __init__(self, **kw):
            super(Model, self).__init__(**kw)
    
        def __getattr__(self, key):
            try:
                return self[key]
            except KeyError:
                raise AttributeError(r"'Model' object has no attribute '%s'" % key)
    
        def __setattr__(self, key, value):
            self[key] = value
    
        def save(self):
            fields = []
            params = []
            args = []
            for k, v in self.__mappings__.items():
                fields.append(v.name)
                params.append('?')
                args.append(getattr(self, k, None))
            sql = 'insert into %s (%s) values (%s)' % (self.__table__, ','.join(fields), ','.join(params))
            print('SQL: %s' % sql)
            print('ARGS: %s' % str(args))
    
    
    
    
    # Field(name, column_type)
    class Field(object):
    	def __init__(self, name, column_type):
    		self.name = name
    		self.column_type = column_type
    
    	def __str__(self):
    		return "<%s:%s>" %(self.__class__.__name__, self.name)
    
    class StringField(Field):
    	def __init__(self, name):
       		super(StringField, self).__init__(name, 'varchar(100)')
    
    class IntegerField(Field):
        def __init__(self, name):
            super(IntegerField, self).__init__(name, 'bigint')
    
    class User(Model):
    	id = IntegerField("id")
    	name = StringField("username")
    	email = StringField("email")
    	password = StringField("password")
    
    
    
    
    u = User(id=1,name="draymonder",email="93958042@qq.com",password="IloveU")
    u.save()
    

    参考文章

    python面向对象编程

  • 相关阅读:
    在XP下基于VHD版XP 2003 win7制作的RAMOS心得
    联想G480笔记本安装系统
    多路由器环境下路由器的入口IP地址及DHCP设置探讨
    无线路由器工作模式的区别
    Shiro学习
    R语言学习网址
    2018年刑侦科目推理试题
    信息熵
    myeclipse使用步骤总结
    eclipse没有server选项
  • 原文地址:https://www.cnblogs.com/Draymonder/p/10671417.html
Copyright © 2020-2023  润新知